Right approach using EntityManager and MDB
hispeedsurfer Nov 9, 2007 7:46 AMHi
I have not much experience with MDBs.
I need to use EntityManager in combination with a MDB. As I have seen here in forum an other user have used this in the same way as follow:
MDB
package de.oats.business.mdb; import javax.annotation.Resource; import javax.ejb.ActivationConfigProperty; import javax.ejb.MessageDriven; import javax.ejb.MessageDrivenContext; import javax.jms.Message; import javax.jms.MessageListener; import javax.jms.ObjectMessage; import org.jboss.annotation.ejb.PoolClass; import org.jboss.seam.annotations.In; @MessageDriven(name="QueryMessageBean", activationConfig = { @ActivationConfigProperty(propertyName="destinationType", propertyValue="javax.jms.Queue"), @ActivationConfigProperty(propertyName="destination", propertyValue="queue/oatsMessageQueue") }) @PoolClass(value=org.jboss.ejb3.StrictMaxPool.class, maxSize=1) public class QueryMessageBean implements MessageListener { @Resource private MessageDrivenContext context; @In(create=true) private UserQuery userquery; public void onMessage(Message message) { QueryTest name = null; try { if (message instanceof ObjectMessage) { ObjectMessage objMessage = (ObjectMessage) message; Object obj = objMessage.getObject(); if (obj instanceof QueryTest) { name = (QueryTest) obj; userquery.setSqlQuery(name.getSqlQuery()); userquery.query(); } else { System.err.println("Expecting ProcessDTO in Message"); } } else { System.err.println("Expecting Object Message"); } } catch (Throwable t) { t.printStackTrace(); context.setRollbackOnly(); } } }
SLSB
package de.oats.business.mdb; import java.io.Serializable; import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; import java.util.Date; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import org.jboss.seam.annotations.In; import org.jboss.seam.annotations.Name; import de.oats.model.QueryResult; @Stateless @Name("userQuery") public class UserQueryBean implements UserQuery{ private String sqlQuery; private static Connection con = null; @PersistenceContext private EntityManager entityManager; public UserQueryBean() { super(); } public String query(){ ResultSet rs; Statement stmt; try { con = MysqlCon.getConnection(); stmt = con.createStatement(); rs = stmt.executeQuery(sqlQuery); QueryResult qrslt = null; while(rs.next()){ qrslt = new QueryResult(); qrslt.setAnzahl(rs.getLong("anzahl")); qrslt.setY20gpnum(rs.getString("y20gpnum")); qrslt.setLat(rs.getDouble("lat")); qrslt.setLon(rs.getDouble("lon")); entityManager.persist(qrslt); } entityManager.flush(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return "5 seconds for " +kindOfQuery; } public void setSqlQuery(String sqlQuery) { this.sqlQuery = sqlQuery; } }
But userquery is always null in spite of @In(create=true)
An other try was to put EntityManager in the ObjectMessage(UserTest) - here is null value on entityManager.
Use Seam 2.0 (seam generatet project) and jboss-4.2.1.GA