【问题标题】:JTA Transactional Resource Implementation by Example通过示例实现 JTA 事务资源
【发布时间】:2015-02-12 07:07:51
【问题描述】:

我正在尝试了解使远程/网络资源符合 JTA 的基本原则,我震惊关于该主题的文档/博客/文章如此之少.

假设我编写了自己的特殊类型的服务器,即“IAmYourFaja”服务器或“IAYF”。假设我编写/实现了我自己的基于 TCP 的网络协议,用于与该服务器交互,称为 IAYFCP(IAYF 通信协议)。最后,我编写了一个 Java 客户端库,用于通过 IAYFCP 访问并向远程 IAYF 服务器发送消息。还和我在一起吗?

现在我有一个用例,我需要执行以下分布式事务:

  1. 在关系/JDBC 数据库中插入一条记录;那么
  2. 向我的 IAYF 服务器发送消息;那么
  3. 将消息推送到 JMS 代理

我需要这些来处理所有事务,这样如果任何一个组件在任何时候发生故障,我都可以将它们全部回滚,并且这些网络资源中的状态不会发生任何改变。

最终目标是能够运行以下代码(此处为伪代码):

// "JTA Example"
DistributedTransaction dTrans = getTransaction();
DataSource jdbcDataSource = getDataSource();
IayfClient iayfClient = getIayfClient();
JmsClient jmsClient = getJmsClient();
try {
    dTrans.begin();

    // 1. Insert a record in a relational/JDBC database
    insertRecord(jdbcDataSource, "INSERT INTO widgets ( fizz, buzz ) VALUES ( 35, true )");

    // 2. Fire a message to my IAYF server
    iayfClient.fireMessage(IayfMessages.LukeIamYourFaja, 12);

    // 3. Push a message to a JMS broker
    jmsClient.publishMessage("Noooooooooo! (then jumps off ledge and Vader goes off to the bar)");

    // If we get here then all 3 networked resources are ready/capable of committing, so do it, do it now!
    dTrans.commit();
} catch(Throwable t) {
    // Something went wrong, roll back all 3.
    dTrans.rollback();
}

所以我使用的 JDBC 驱动程序和 JMS 库已经是 JTA 兼容的。这意味着要使此代码成为可能,我需要使我的 IAYF 客户端库也与 JTA 兼容。问题是,我不明白我需要实现哪些 JTA 接口:

所以有几个问题:

  1. 我需要实现哪个接口(以及为什么):XAResourceUserTransaction,或两者兼而有之?
  2. 我需要做的就是遵守 JTA 并使我的 IAYF 客户端/服务具有事务性吗?我还需要做什么才能使上面的“JTA 示例”代码按预期工作?
  3. 判断对错:Java EE 容器有自己的事务管理器,如果我在非 Java EE/ JTA 兼容容器,那么我需要提供自己的事务管理器,并且可以使用 BitronixAtomikos 之类的东西来完成此操作?

【问题讨论】:

    标签: java transactions jta atomikos bitronix


    【解决方案1】:

    UserTransaction 接口是您在应用程序(上面的伪代码)中用于处理不同资源的接口。 DistributedTransaction 将实现 UserTransaction 接口。该 DistributedTransaction 对象是您访问事务管理器的方式。

    为了让事务管理器针对您的 3 个不同资源执行分布式事务,每个资源都需要实现 XAResource 接口并以某种方式向事务管理器注册。如何向事务管理器注册的细节取决于实现。例如,请参阅 WebLogic 文档的这一部分:Registering an XAResource to Participate in Transactions

    因此,您的客户端将实现 XAResource 并将 IAYFCP 与您的 IAYF 服务器对话。这也意味着您的 IAYFCP 协议将需要支持 2 阶段提交。

    从第 3 节开始,this JBossTS documentation 也涵盖了 XAResource 接口。

    是的,根据this Wikipedia article on JTA,Bitronix、Atomikos 和 JBossTS 都被列为开源 JTA 实现。我建议选择一个,实现一个存根 XAResource,然后尝试向事务管理器注册你的“Hello, world”XAResource,看看它会调用你的 start/prepare/commit/rollback 方法。

    【讨论】:

    • 感谢@Harold L (+1)!一些跟进:(1)请确认:我不需要需要实现UserTransaction,因为这将由事务管理器提供,是吗?
    • (2) 当您说“您的 IAYFCP 协议将需要支持 2 阶段提交...”时,这是我需要实现的另一个 Java API(如果是这样,哪个 API 以及它记录在哪里?),还是只是我需要将 the 2 phase commit protocol 的基本原理解释到客户端-服务器通信中?
    • (3) 请确认,只是因为我无法完全理解您对上述问题的回答:我只需要像 Bitronix/Atomikos/JBossTS 这样的东西 if 我正在使用Java EE 服务器外部 的分布式事务(因为Java EE 服务器有自己的事务管理器),是吗? 此外,如果我确实需要一个“独立”的事务管理器,例如 Bitronix/Atomikos/JBossTS,那么我是将其作为自己的服务器/VM,还是只是一个库我像任何其他 JAR 一样进入我的项目?再次感谢 - 赏金即将到来!
    • 如果你不能帮助我解决这些后续问题,我不能给你赏金!请指教!
    • Ugghhh,经典的 SO。受阻和阻尼。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 2021-10-31
    • 1970-01-01
    • 2018-05-02
    相关资源
    最近更新 更多