【发布时间】:2015-02-12 07:07:51
【问题描述】:
我正在尝试了解使远程/网络资源符合 JTA 的基本原则,我震惊关于该主题的文档/博客/文章如此之少.
假设我编写了自己的特殊类型的服务器,即“IAmYourFaja”服务器或“IAYF”。假设我编写/实现了我自己的基于 TCP 的网络协议,用于与该服务器交互,称为 IAYFCP(IAYF 通信协议)。最后,我编写了一个 Java 客户端库,用于通过 IAYFCP 访问并向远程 IAYF 服务器发送消息。还和我在一起吗?
现在我有一个用例,我需要执行以下分布式事务:
- 在关系/JDBC 数据库中插入一条记录;那么
- 向我的 IAYF 服务器发送消息;那么
- 将消息推送到 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 接口:
所以有几个问题:
【问题讨论】:
标签: java transactions jta atomikos bitronix