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