Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JMS和EJB中事务的正确使用_Java_Transactions_Ejb_Jms_Jta - Fatal编程技术网

Java JMS和EJB中事务的正确使用

Java JMS和EJB中事务的正确使用,java,transactions,ejb,jms,jta,Java,Transactions,Ejb,Jms,Jta,我想知道如何在EJB容器中正确使用JMS事务。我发现这段代码,它在无状态bean中使用JMS发送消息: @Stateless public class SendEventsBean { private static final Logger log = Logger.getLogger(SendEventsBean.class); @Resource(mappedName = "jms/MyConnectionFactory") private ConnectionFactory

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

默认情况下,事务是使用事务属性“required”进行容器管理的。假设客户机直接调用sendEvent(),因此事务从sendEvent()的开头开始,到结尾结束(->在方法的末尾执行提交)。 在方法的最后发生提交之前关闭连接(jmsConnection.close())不是不对吗

此外,我想知道在createSession()上设置事务属性和设置true/false是如何相互作用的

如果容器已经启动了一个事务(使用容器管理的事务),那么设置createSession(true,…)有意义吗?这是否只为JTA事务中的JMS消息(而不是DB)创建了一个新事务

对于createSession(false,…),我说得对吗,消息仍然是事务性的,因为容器启动了事务

在方法的最后发生提交之前关闭连接(jmsConnection.close())不是不对吗

不。关闭连接与JTA事务中的提交无关(这里就是这种情况,它是一个带有CMT的ejb)。这只是适当和必要的清理。注意,这些是容器返回的连接,底层事务管理器知道如何使用资源提交事务。JDBC连接也是如此

如果容器已经启动了一个事务(使用容器管理的事务),那么设置createSession(true,…)有意义吗

对于Weblogic,您肯定应该使用非事务性会话。但是,对JMS连接使用XA连接工厂有什么重要意义呢

然而,与JBOSS相关的文章建议将createSession(true…)设置为一种好的实践,即使在CMT ejb中也是如此

无论设置如何,都必须强制使用基于JCA/XA的连接工厂

对于createSession(false,…),我是对的,消息是 但是,由于 集装箱

不可以。如上所述,您必须使用XA连接工厂