我试图环绕我的头值在Java事务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();
}
}
Run Code Online (Sandbox Code Playgroud)
不要太忙于上面的实际代码.这个想法很简单:一个事务文件编写器,它创建一个文件并写入它.它的rollback()方法删除文件,从而将文件系统返回到之前的状态commit(Object).
我在这里错过了什么吗?这是JTA的全部优惠吗?或者是否有一整套与事务性不同的维度/方面,而上面的简单例子没有表示?我猜测后者,但还没有看到JTA文档中的任何具体内容.如果我错过了什么,那么它是什么,有人可以向我展示具体的例子吗?我可以看到事务性是JDBC的一个重要组成部分,但希望能够通过数据库以外的其他方式获取JTA的示例.
正如其他人提到的那样,JTA的主要好处不是单个事务案例,而是多个事务的编排.
在适当的上下文中使用时,您的"事务性文件"是一个很好的概念性示例.
考虑一个人为的用例.
您正在上传具有关联元数据的图片,然后您希望警告基础结构该文件已到达.
这个"简单"的任务充满了可靠性问题.
例如,此工作流程:
String pathName = saveUploadedFile(myFile);
saveMetaData(myFile.size(), myFile.type(), currentUser, pathName);
queueMessageToJMS(new FileArrivalEvent(user, pathName);
Run Code Online (Sandbox Code Playgroud)
这段代码涉及文件系统和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();
}
Run Code Online (Sandbox Code Playgroud)
现在它"全部有用",或"没有一个有效".
通常情况下,由于大多数系统没有事务管理器,所以人们会通过箍来使这种事情安全地工作.但是使用事务管理器(即JTA),TM可以为您管理所有的环节,并且您可以保持代码清洁.
如果您对行业进行调查,您会发现很少有交易管理人员.最初它们是"企业"级系统使用的专有程序.TIBCO是着名的,IBM有一个,微软有一个.燕尾服曾经很受欢迎.
但是对于Java和JTA,以及无处不在的Java EE(等)服务器,"每个人"都有一个事务管理器.我们在Java世界中获得这个"免费"的编排.它很方便.
Java EE使事务管理器无处不在,并且事务处理考虑了背景.Java EE意味着"永远不必再次编写commit()".(显然Spring提供类似的设施).
对于大多数系统,没有必要.这就是为什么大多数人不太了解它,或者根本不会错过它.大多数系统都填充单个数据库,或者根本不担心围绕多个系统编排的问题.这个过程可能是有损的,他们建立了自己的清理机制,无论如何.
但是当你需要它时,它非常好.同时致力于多个系统可以解决许多令人头疼的问题.