代码之家  ›  专栏  ›  技术社区  ›  Ittai

javax.jms.ConnectionFactory与javax.jms.XAConnectionFactory的区别

  •  2
  • Ittai  · 技术社区  · 15 年前

    由于分布式事务的需要,我正在进入JTA的世界,我不确定 javax.jms.ConnectionFactory javax.jms.XAConnectionFactory 或者更准确地说怎么可能 javax.jms.ConnectionFactory连接工厂 javax.jms.XAConnectionFactory 可以帮我。

    详细信息:我使用Atomikos essentials作为我的事务管理器,我的应用程序运行在ApacheTomcat6上。

    我正在运行一个带有虚拟应用程序的小型POC,其中有我的JMS提供程序( OpenMQ )注册为 JNDI 资源。

    <Resource name="jms/myConnectionFactory" auth="Container"  
     type="com.atomikos.jms.AtomikosConnectionFactoryBean"  
     factory="com.atomikos.tomcat.EnhancedTomcatAtomikosBeanFactory"   
    uniqueResourceName="jms/myConnectionFactory"  
    xaConnectionFactoryClassName="com.sun.messaging.XAConnectionFactory"  
    maxPoolSize="3"/>
    

    奇怪的是,在我的代码中,我这样做:

    Context ctx = new InitialContext();  
    ConnectionFactory queueConnectionFactory =  
    (ConnectionFactory)ctx.lookup("java:comp/env/jms/myQueueFactory");  
    javax.jms.Connection connection = queueConnectionFactory.createConnection();  
    Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
    

    UserTransaction 它有两个完美的表现 MessageProducer s与任意一个 Commit Rollback

    我不明白的是我用的是什么 javax.jms.XAConnectionFactory.createConnection() 方法和我得到一个 Session javax.jms.XAConnectionFactory 角色?

    javax.jms.BasicConnectionFactory )我验证了XA类不重写 createConnection .

    2 回复  |  直到 13 年前
        1
  •  2
  •   Nicholas    15 年前

    ConnectionFactory和XAConnectionFactory之间的区别的核心在于,XAConnectionFactory创建创建XASessions的XAConnections。XASessions代表真正的区别,因为(引用 JMS JavaDocs :)

    换句话说,XASession使XA实例具有事务意识。但是,即使对于完全兼容的JMS提供程序,此特定实现也是可选的。来自同一个JavaDoc:

    XAResource为在多个事务上交错工作、恢复正在进行的事务列表等提供了一些相当复杂的工具。支持JTA的JMS提供程序必须完全实现此功能。这可以通过使用支持XA的数据库的服务来实现,或者JMS提供者可以选择从头开始实现此功能。

    换句话说,提供者可能要求您指定一个XA或非XA JMS资源,或者,就像在您的情况下一样,提供者可以透明地执行所有JTA管道 .

        2
  •  1
  •   T.Rob    15 年前

    实际上,您提供的任何示例代码都不会执行XA功能。如果所需的只是消息处于同步点下,那么您可以通过一阶段提交(1PC)来完成。但是,如果您希望,例如,JMS消息和DB更新发生在一个协调的工作单元中,那么您将使用两阶段提交(2PC),即XA。在同一个传输提供程序上跨两个消息生产者进行协调不需要XA 2PC。

    如果您使用的是2PC,那么除了提交和回滚之外,您还可以在代码的某个地方调用BEGIN。在你的例子中缺少这个动词,这就是为什么我说你看起来不像在做2PC,BEGIN调用将与事务管理器通信,以便在参与的资源管理器之间建立一个事务上下文。然后提交将导致消息 数据库在一个工作单元中更新以完成。有趣的是,如果你只有一个参与的资源管理器,一些传输会悄悄地将你优化回1PC。在这种情况下,看起来你是在做2PC,但实际上是在得到1PC。因为只有一个资源管理器,没有在这个优化的可靠性损失。

    另一方面,如果你做的是1PC,你不会看到任何区别,这两种类型的连接工厂。它将展示你所描述的行为。

    推荐文章