java - JTA 事务资源实现示例

标签 java transactions jta atomikos bitronix

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

假设我编写了自己的特殊类型的服务器,“IAmYourFaja”服务器,或“IAYF”。假设我编写/实现了我自己的基于 TCP 的网络协议(protocol)来与该服务器进行交互,称为 IAYFCP(IAYF 通信协议(protocol))。最后,我编写了一个 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 接口(interface):

那么几个问题:

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

最佳答案

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

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

因此您的客户端将实现 XAResource 并向您的 IAYF 服务器发送 IAYFCP。这也意味着您的 IAYFCP 协议(protocol)需要支持两阶段提交。

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

是的,根据 this Wikipedia article on JTA,Bitronix、Atomikos 和 JBossTS 都被列为开源 JTA 实现。 .我建议选择一个,实现 stub XAResource,然后尝试向事务管理器注册您的“Hello, world”XAResource,以查看它会调用您的开始/准备/提交/回滚方法。

关于java - JTA 事务资源实现示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27462836/

相关文章:

java - 没有 keystore 的 key 工具

Java spring 数据库应用程序不会退出对 org.enHydra.jdbc.pool.PoolKeeper 的引用仍然处于 Activity 状态,为什么?

java - 在Java中调整BufferedImage的亮度和对比度

java - apache 集合中的 Transformer15

Java小程序访问环境变量

oracle - 回滚@Oracle 上的存储过程

c# - 使用 finally 而不是 catch

sql-server - 为什么 CATCH block 允许在 SQL Server 2012 中提交事务

java - Atomikos vs JOTM vs Bitronix vs?

spring - 我应该使用哪个事务管理器(JTA 与 JPA)?