【问题标题】:JMS Session and JPA transaction with XA使用 XA 的 JMS 会话和 JPA 事务
【发布时间】:2015-01-20 23:16:42
【问题描述】:

我将 WebSphere 8.5 与 EJB 3.1 和 JMS 通用提供程序一起使用。

我需要使用无状态会话 bean 作为生产者在队列中写入消息。 EJB 使用TransactionAttributeType.REQUIRED 进行注释,因为我需要在将消息发送到队列并使用这些消息读取生产者写入的记录之前执行一些“数据库插入”。

问题是,如果我定义了一个 JDBC 非 XA 数据源,生产者将消息写入队列,但服务器抱怨本地资源的第 2 阶段提交失败(我认为是数据源本身)并且不调用onMessage MDB 的方法。如果我定义 JDBC XA 一切正常。

我的问题:

  • JMS 会话是否需要成为默认 XA 资源?为什么?
  • 如果我将 JMS 连接工厂配置为在 JTA 事务中创建非 XA JMS 会话,会发生什么情况?这是一种不好的做法吗?
  • 如果消费者开始消费消息,而生产者仍在完成对数据库的操作,会发生什么情况?消费者会因为它们在同一个事务中而看到数据库的变化吗?

提前致谢,问候

【问题讨论】:

    标签: ejb jms jta websphere-8 xa


    【解决方案1】:

    JMS 会话是否需要成为默认 XA 资源?为什么?
    您需要这两种资源都是 XA。这是分布式事务 - 在 2 个不同的资源之间 - 数据库和 JMS 队列。要参与一个相同的事务,它们都必须是 XA(可以选择在事务中拥有一个非 XA 资源 - 使用最后一个参与者支持,但我不建议这样做)。

    如果您的资源不是 XA,那么您可以将 bean 设置为 NOT_SUPPORTED 并自己处理事务 - 意味着 - 管理 2 个单独的事务,首先是数据库,其次是 JMS 队列。但是,由于 db 事务将首先提交,因此您必须在发送消息失败时(因为您无法回滚)进行代码补偿,以避免出现数据库状态已更改而您没有发送消息的情况。

    如果我将 JMS 连接工厂配置为在 JTA 事务中创建非 XA JMS 会话会怎样?
    如果另一个资源是该事务的一部分(例如数据库),您将有关于 2 阶段提交支持的异常。

    如果消费者开始消费消息,而生产者仍在完成对数据库的操作,会发生什么?
    我不清楚,你在问什么。如果生产者先写入数据库,然后在一个 XA 事务中写入队列,它们将同时提交,因此消费者将无法先看到消息。
    但是,如果您创建 2 个单独的事务(一个用于数据库访问,第二个用于队列访问),您可能会遇到这样一种情况,如果您首先提交队列,则该消费者可以读取消息。但在这种情况下,如果没有提交,消费者将无法看到对数据库的更改。

    消费者会因为它们在同一个事务中而看到数据库的变化吗?
    生产者和消费者不在同一个事务中(生产者创建消息并提交,消费者启动单独的事务来读取)。

    【讨论】:

    • 嗨,我知道这个问题已经很久没有回答了。但是我遇到了与上面提到的类似的问题。在事务中,我们试图将数据持久化到数据库中,并从生产者向消费者发送 JMS 消息。但问题是消费者在提交数据之前就收到了消息。生产者中的持久性和消息传递都使用 XA-datasource 和 XA 连接工厂。任何解决此竞争条件的指针?更多信息 - stackoverflow.com/questions/54343688/…
    • @Gandhi 我看到你的问题与 JBoss 有关。 JBoss 在 XA 事务方面有很多问题。默认情况下,即使您认为您为 xa 配置了数据源,它也可能使用普通事务。如果两者 - 数据库驱动程序和 jms 提供程序 - 完全支持 XA,它应该可以正常工作 - 这意味着只有在成功提交 DB 和 JMS 消息后才能在队列中使用。 (除非我没有正确理解你的问题。)
    • 您好,我正在使用 DefaultJMSConnectionFactory 池连接工厂,其事务类型为 XA 和 OracleXADataSource。还通过管理控制台确认 xa 数据源处于活动状态。但它仍然失败。有什么想法吗?
    • @Gandhi ,您使用的是哪个 JMS 提供程序? (嵌入式 JBoss,还是第三方?)如果您使用嵌入式 jboss,您的连接工厂可能不正确。检查这篇文章 - mastertheboss.com/jboss-server/jboss-jms/… - 看起来您必须使用 @Resource(mappedName="java:/JmsXA") 在 JMS 中使用 XA。正如我已经写过的,JBoss 在 XA 的情况下非常不可靠,也许可以试试 OpenLiberty 或 WebSphere Liberty
    • 再次感谢 Gas 的回复。我正在使用您指定的相同内容 - “java:/JmsXA”,它又指“"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-26
    • 2011-09-07
    • 2014-03-31
    • 2012-06-21
    相关资源
    最近更新 更多