我想知道如何在EJB容器中正确使用JMS事务。我找到了这个代码,它在无状态bean中使用JMS发送消息:
@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?)
默认情况下,事务是使用事务属性“required”进行容器管理的。假设客户端直接调用sendEvent(),以便事务在开始时开始并在sendEvent()结束时结束( - >在方法的最后执行提交)。 关闭连接(jmsConnection.close())在方法的最后提交之前是不是错了?
此外,我想知道如何在createSession()中设置事务属性和设置true / false进行交互。
如果容器已经启动了事务(使用容器管理的事务),那么设置createSession(true,...)是否有意义?这是否仅为JTA事务中的JMS消息(而不是DB)创建新事务?
使用createSession(false,...)我是对的,因为容器启动了事务,所以消息仍然是事务性的吗?
答案 0 :(得分:2)
关闭连接(jmsConnection.close())在方法最后提交之前是不是错了?
没有。关闭连接与JTA事务中的提交无关(在这种情况下,它是CMT的ejb)。这是正确和必要的清理。请注意,这些是容器返回的连接,而基础事务管理器知道如何使用资源提交事务。 JDBC连接也是如此。
如果容器已经启动了事务(使用容器管理的事务),那么设置createSession(true,...)是否有意义?
对于Weblogic,您绝对应该使用非事务会话。但是,为您的JMS连接使用XA连接工厂非常重要。
http://docs.oracle.com/cd/E11035_01/wls100/jms/trans.html#wp1031645 http://www.informit.com/articles/article.aspx?p=26137&seqNum=8
然而,与JBOSS相关的文章建议将createSession(true ...)设置为一个好的做法,即使在CMT ejb中也是如此
https://developer.jboss.org/thread/213629?tstart=0&_sscc=t http://www.coderanch.com/t/606786/EJB-JEE/java/EJB-CMT-sending-JMS-message
无论设置如何,都必须强制使用基于JCA / XA的连接工厂。
使用createSession(false,...)我是对的,那些消息是 然而,交易是因为交易开始了 容器
没有。如上所述,您必须使用XA连接工厂。