Jboss 当连接、会话和MessageProducer被手动缓存时,为什么我的无状态会话Bean不在事务中发送消息?
我正在使用一个JMS代理,在那里创建MessageProducer很慢/很昂贵。 因此,我决定将MessageProducer缓存在无状态会话Bean中。 这对于非事务性的情况非常有效,但在使用容器管理的XA事务时,我遇到了问题—消息是发送的,但不是作为事务的一部分发送的。 你知道怎么回事吗 问题代码:Jboss 当连接、会话和MessageProducer被手动缓存时,为什么我的无状态会话Bean不在事务中发送消息?,jboss,transactions,ejb,jms,stateless-session-bean,Jboss,Transactions,Ejb,Jms,Stateless Session Bean,我正在使用一个JMS代理,在那里创建MessageProducer很慢/很昂贵。 因此,我决定将MessageProducer缓存在无状态会话Bean中。 这对于非事务性的情况非常有效,但在使用容器管理的XA事务时,我遇到了问题—消息是发送的,但不是作为事务的一部分发送的。 你知道怎么回事吗 问题代码: @Stateless(name = "MyProducerSessionBean") @TransactionManagement(value = TransactionManagementTy
@Stateless(name = "MyProducerSessionBean")
@TransactionManagement(value = TransactionManagementType.CONTAINER)
@TransactionAttribute(value = TransactionAttributeType.REQUIRED)
public class MyProducerSessionBean implements MyProducerSessionBeanLocal
{
@Resource(name = "java:/jms/myConnectionFactory")
ConnectionFactory myConnectionFactory;
@Resource(name = "java:/jms/myOutputQueue")
Queue myOutputQueue;
Connection connection;
Session session;
MessageProducer producer;
public MyProducerSessionBean() {}
@PostConstruct
public void ejbCreate() {
try {
connection = myConnectionFactory.createConnection();
session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
producer = session.createProducer(myOutputQueue);
} catch (JMSException e) {
cleanup();
throw new EJBException(e);
}
}
@TransactionAttribute(value = TransactionAttributeType.REQUIRED)
@Override
public void sendMessage() {
try {
ObjectMessage message = session.createObjectMessage("test");
producer.send(message);
} catch (JMSException e) {
cleanup();
throw new EJBException(e);
}
}
@PreDestroy
public void ejbRemove() {
cleanup();
}
public void cleanup() {
try {
if(producer != null) producer.close();
} catch (JMSException e) {
e.printStackTrace();
}
try {
if(session != null) session.close();
} catch (JMSException e) {
e.printStackTrace();
}
try {
if(connection != null) connection.close();
} catch (JMSException e) {
e.printStackTrace();
}
producer = null;
session = null;
connection = null;
}
}
在sendMessage()方法中创建连接时,一切正常,而不是在@PostConstruct中缓存生产者:
@Stateless(name = "MyProducerSessionBean")
@TransactionManagement(value = TransactionManagementType.CONTAINER)
@TransactionAttribute(value = TransactionAttributeType.REQUIRED)
public class MyProducerSessionBean implements MyProducerSessionBeanLocal
{
@Resource(name = "java:/jms/myConnectionFactory")
ConnectionFactory myConnectionFactory;
@Resource(name = "java:/jms/myOutputQueue")
Queue myOutputQueue;
public MyProducerSessionBean() {}
@TransactionAttribute(value = TransactionAttributeType.REQUIRED)
@Override
public void sendMessage() {
try {
Connection connection = myConnectionFactory.createConnection();
Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
MessageProducer producer = session.createProducer(myOutputQueue);
ObjectMessage message = session.createObjectMessage("test");
producer.send(message);
producer.close();
session.close();
connection.close();
} catch (JMSException e) {
e.printStackTrace();
throw new EJBException(e);
}
}
}