【发布时间】:2015-04-06 13:56:20
【问题描述】:
我想知道如何在 EJB 容器中正确使用 JMS 事务。我找到了这段代码,它使用 JMS 在无状态 bean 中发送消息:
@Stateless
public class SendEventsBean {
private static final Logger log = Logger.getLogger(SendEventsBean.class);
@Resource(mappedName = "jms/MyConnectionFactory")
private ConnectionFactory jmsConnectionFactory;
@Resource(mappedName = "jms/myApp/MyQueue")
private Queue queue;
public void sendEvent() {
Connection jmsConnection = null;
try {
connection = jmsConnectionFactory.createConnection();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer producer = session.createProducer(queue);
MyObj obj = new MyObj(1, "Foo");
ObjectMessage myObjMsg = session.createObjectMessage(obj);
producer.send(myObjMsg);
} catch (JMSException jmxEx) {
log.error("Couldn't send JMS message: ", jmsEx);
}finally{
if (jmsConnection != null) {
try {
jmsConnection.close();
}catch(JMSException ex) {
log.warn("Couldn't close JMSConnection: ", ex);
}
}
}
}
(来自When should I close a JMS connection that was created in a stateless session bean?)
默认情况下,事务由容器管理,事务属性为“必需”。假设客户端直接调用 sendEvent(),事务从 sendEvent() 的开头开始,在 sendEvent() 的结尾结束(-> 在方法的最后执行提交)。 在方法的最后发生提交之前关闭连接(jmsConnection.close())是不是错了?
此外,我想知道在 createSession() 中设置事务属性和设置真/假是如何交互的。
如果容器已经启动了一个事务(使用容器管理的事务),那么设置 createSession(true,...) 是否有意义?这是否会为 JTA 事务中的 JMS 消息(而不是 DB)创建一个新事务?
我说对了 createSession(false, ...) 是不是因为容器启动了事务,所以消息仍然是事务性的?
【问题讨论】:
标签: java transactions ejb jms jta