繁体   English   中英

在JMS和EJB中正确使用事务

[英]Correct usage of transactions in JMS and EJB

我想知道如何在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);
            }
        }
    }
  }

(来自何时应关闭在无状态会话Bean中创建的JMS连接?

默认情况下,事务是使用事务属性“必需”进行容器管理的。 假设客户端直接调用sendEvent(),则事务从sendEvent()的开始处开始,并在sendEvent()的结尾处结束(->在该方法的末尾执行一次提交)。 在方法的最后进行提交之前关闭连接(jmsConnection.close())是否不是错误的?

此外,我想知道如何在createSession()上设置事务属性和设置true / false。

如果容器已经存在一个事务(使用容器管理的事务),那么设置createSession(true,...)是否有意义? 这是否仅在JTA事务内为JMS消息创建了一个新事务(对于DB也没有)?

通过createSession(false,...)我是对的,但是由于容器启动了事务,因此消息是事务性的吗?

在方法的最后进行提交之前关闭连接(jmsConnection.close())是否不是错误的?

否。关闭连接与JTA事务中的提交无关(在这种情况下,这是带有CMT的ejb)。 这只是适当且必要的清理。 请注意,这些是容器返回的连接,基础事务管理器知道如何使用资源来提交事务。 JDBC连接也是如此。

如果容器已经存在一个事务(使用容器管理的事务),那么设置createSession(true,...)是否有意义?

对于Weblogic,您绝对应该使用非事务处理会话。 但是,对于XMS连接使用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相关的文章建议即使在CMT ejb中也将createSession(true ...)设置为一种好习惯

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连接工厂。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM