JTA事务资源实现示例

时间:2014-12-13 19:37:36

标签: java transactions jta atomikos bitronix

我试图了解制作符合JTA的远程/网络资源的基本原则,并且我通过几乎没有文档/博客/文章来了解 thunderstruck 关于这个问题。

假设我已经编写了自己特殊类型的服务器," IAmYourFaja "服务器,或" IAYF "。让我们说我编写/实现了我自己的基于TCP的网络协议,用于与该服务器进行交互,称为IAYFCP(IAYF Comms Protocol)。最后,我编写了一个Java客户端库,用于通过IAYFCP访问和发送消息到远程IAYF服务器。还在我身边吗?

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

  1. 在关系/ JDBC数据库中插入记录;然后
  2. 向我的IAYF服务器发送消息;然后
  3. 将消息推送到JMS代理
  4. 我需要对所有人进行交易,这样如果任何一个组件在任何时候都失败了,我可以回滚所有这些组件,并且在这些网络资源中没有任何改变状态。

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

    // "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之类的东西来完成此任务吗?

1 个答案:

答案 0 :(得分:4)

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

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

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

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

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