- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在努力思考 Java Transactions API (JTA) 及其实现之一 Bitronix 下的值。但随着我越来越深入地研究文档,我不禁想到以下简单示例:
public interface Transactional {
public void commit(Object);
public void rollback();
}
public class TransactionalFileWriter extends FileWriter implements Transactional {
@Override
public void commit(Object obj) {
String str = (String)obj;
// Write the String to a file.
write(str);
}
@Override
public void rollback() {
// Obtain a handler to the File we are writing to, and delete the file.
// This returns the file system to the state it was in before we created a file and started writing to it.
File f = getFile();
// This is just pseudo-code for the sake of this example.
File.delete(f);
}
}
// Some method in a class somewhere...
public void doSomething(File someFile) {
TransactionalFileWriter txFileWriter = getTxFW(someFile);
try {
txFileWriter.commit("Create the file and write this message to it.");
} catch(Throwable t) {
txFileWriter.rollback();
}
}
不要太拘泥于上面的实际代码。这个想法很简单:一个创建文件并写入文件的事务文件编写器。 rollback()
方法删除文件,从而将文件系统返回到 commit(Object)
之前的状态。
我是不是漏掉了什么?这是 JTA 提供的全部吗?或者是否存在我上面的简单示例未表示的交易性的一组完全不同的维度/方面?我猜是后者,但尚未在 JTA 文档中看到任何具体内容。如果我遗漏了什么,那是什么,有人可以给我看具体的例子吗?我可以看到事务性是 JDBC 的一个重要组成部分,但希望能得到一个 JTA 与数据库以外的其他东西一起使用的例子。
最佳答案
正如其他人所提到的,JTA 的主要优势不是单个事务案例,而是多个事务的编排。
在适当的上下文中使用时,您的“交易文件”是一个优秀的概念性示例。
考虑一个人为设计的用例。
您正在上传一张具有关联元数据的图片,然后您希望提醒基础架构该文件已到达。
这个“简单”的任务充满了可靠性问题。
例如,这个工作流:
String pathName = saveUploadedFile(myFile);
saveMetaData(myFile.size(), myFile.type(), currentUser, pathName);
queueMessageToJMS(new FileArrivalEvent(user, pathName);
这段代码涉及文件系统和 2 个不同的服务器(DB 和 JMS)。
如果 saveUploadedFile 成功,但 saveMetaData 没有,您现在在文件系统上有一个孤立文件,可以说是“文件泄漏”。如果 saveMetaData 成功,但队列没有,您已经保存了文件,但“没有人知道”。交易的成功依赖于所有 3 个组件成功执行其任务。
现在,放入 JTA(不是真正的代码):
beginWork();
try {
String pathName = saveUploadedFile(myFile);
saveMetaData(myFile.size(), myFile.type(), currentUser, pathName);
queueMessageToJMS(new FileArrivalEvent(user, pathName);
} catch(Exception e) {
rollbackWork();
} finally {
commitWork();
}
现在它“全部有效”,或者“都无效”。
通常人们会越过重重障碍使这种事情安全地工作,因为大多数系统没有事务管理器。但是使用事务管理器(即 JTA),您的 TM 会为您管理所有的环,并且您可以保持代码干净。
如果您调查行业,您会发现交易经理很少。最初它们是“企业”等级系统使用的专有程序。 TIBCO是有名的,IBM有一个,微软有一个。燕尾服曾经很流行。
但是有了 Java、JTA 和无处不在的 Java EE(等)服务器,“每个人”都有一个事务管理器。我们在 Java 世界中“免费”获得此编排。而且它很方便。
Java EE 使事务管理器无处不在,事务处理成为后台考虑因素。 Java EE 意味着“永远不必再次编写 commit()”。 (显然 Spring 提供了类似的设施)。
对于大多数系统来说,这不是必需的。这就是为什么大多数人对它知之甚少,或者干脆不要错过它的原因。大多数系统填充单个数据库,或者根本不用担心围绕多个系统编排的问题。这个过程可能是有损的,他们已经建立了自己的清理机制,无论如何。
但是当你需要它的时候,它非常好。同时致力于多个系统可以解决很多令人头疼的问题。
关于java - JTA 的真正交付值(value)是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24462757/
JTA 和本地事务有什么区别? 如果有一个示例可以展示何时使用 JTA 以及何时使用本地事务,那就太好了。 最佳答案 JTA 是用于管理 Java 事务的通用 API。它允许您以资源中立的方式启动、提
我正在使用 Atomikos 进行 JTA 事务。 我对 JTA 有以下设置: UserTransactionImp userTransactionImp = new UserTransactionI
已结束。此问题不符合 Stack Overflow guidelines .它目前不接受答案。 我们不允许提出有关书籍、工具、软件库等方面的建议的问题。您可以编辑问题,以便用事实和引用来回答它。 关闭
我想找到一种方法来应用带有 JTA @Transactional 注释的自定义拦截器。 我有一个带有 @Transactional 的方法,它是业务事务之一。在该方法中我想: 进行一些数据库操作 使用
我正在更新旧的应用程序,并尽可能少地重新编程。我创建了一个与旧页面类似的页面,其中仅包含一些测试数据,以确保我可以创建与 ejb/jpa 的链接,但我遇到了问题。我将发布 jsp、persistenc
本文整理了Java中com.arjuna.ats.internal.jta.tools.osb.mbean.jta.XAResourceRecordBean类的一些代码示例,展示了XAResource
我们将 JPA 1.0 用于基于 ORM 的操作,并且我们希望我们的应用程序拥有 JTA 数据源。我们只有 1 个数据库,我们的应用程序将连接到该数据库。 我们在 Controller 类中开始我们的
本文整理了Java中com.arjuna.ats.internal.jta.tools.osb.mbean.jta.XAResourceRecordBean.()方法的一些代码示例,展示了XAReso
本文整理了Java中com.arjuna.ats.internal.jta.tools.osb.mbean.jta.XAResourceRecordBean.getUid()方法的一些代码示例,展示了
我如何定义 在 persistence.xml 中? 我的项目在 Tomcat 6 和 Tomcat 7 中运行良好。 现在我正在使用 Struts 2 Spring 3.0.5 JPA 2 Jbos
我想为我正在处理的应用程序编写集成测试。它使用 JTA(多资源)并在应用程序服务器内运行。为这种情况编写自动化测试的最佳方法是什么?使用像 atomikos 这样的独立事务管理器,或者以某种方式利用应
我们正在使用 jboss 管理的 EntityMangerFactory 使用以下 spring bean 现在在我们的 spring bean 中,我们使用 @PersistenceContext
从 JTA 规范中,我了解到它仅用于调用线程的分布式事务(或支持)。这是否意味着事务不能跨越多个线程?还是取决于实现? 是否有任何 JTA 实现支持跨线程 XA? 谢谢! 最佳答案 您可以使用 Tra
本地交易和BMT相同吗? 我们需要 transactionManager 来进行本地事务吗? 我读到 transactionManager 对于本地事务将无效。这是正确的吗? JTA 是否为 CMT
我是 Spring 和 hibernate 新手,请帮忙, 我正在使用(Jboss 6.0 Final 作为服务器) org.springframework.transaction.jta.JtaTr
假设我有一个托管 bean 并且定义了一个 EntityManager。我想知道交易是如何运作的以及它们在各种不同情况下的表现如何。从文档中我了解到,flush()实际上用于覆盖提交上的延迟并立即执行
试图将我的头脑围绕在 JTA 上并任意选择 Bitronix 作为 impl,因为文档更容易获得(与 Atmikos 相反,Atmikos 让你注册并注册以获得 src/docs/jars/等等)。
我使用以下我在网上找到的代码 ( Here ) 作为 JTA 事务处理的示例: // Get a UserTransaction UserTransaction txn = new I
我有 2 个 MySQL 架构和各自的 MysqlXADataSource 配置如下 - @Bean(name = "sourceDataSource") @Primary public DataSo
我正在开发一个Web应用程序,我必须使用我从未使用过的JTA。我开始使用 EntityManager 但它似乎在这里不起作用。当我使用 EntityManager 时,我收到此消息: Only per
我是一名优秀的程序员,十分优秀!