gpt4 book ai didi

ejb - 使用 XA 的 JMS session 和 JPA 事务

转载 作者:行者123 更新时间:2023-12-05 04:16:34 25 4
gpt4 key购买 nike

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

我需要使用无状态 session bean 作为生产者在队列中写入消息。 EJB 带有 TransactionAttributeType.REQUIRED 注释,因为在我向队列发送消息并使用这些消息读取生产者写入的记录之前,我需要执行一些“DB 插入”。

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

我的问题:

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

提前致谢,问候

最佳答案

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

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

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

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

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

关于ejb - 使用 XA 的 JMS session 和 JPA 事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27084587/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com