1 Reply Latest reply on Nov 12, 2007 11:24 AM by Pete Muir

    Right approach using EntityManager and MDB

    Andreas Franke Apprentice

      Hi

      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