Java 自定义XAResource(JTA)
今天,我的团队负责人让我为我们的一个内部产品实现一个定制的XAResource包装器(它提供了类似于SFTP服务器的功能,但它是分布式的,用Java编写的,还有很多附加功能……没关系=) 这里很重要的一点是,我们的应用程序是一个独立的应用程序(因此我需要使用一个嵌入式JTA事务管理器,比如Atomikos),它已经包含Spring、JMS和Hibernate(也必须包含在分布式事务中) 问题是我已经在谷歌上搜索了一段时间,但我还没有找到任何关于实现和配置自定义XAResource实现示例的资源。 另外,事实上,我已经找到了答案,但最好是一步一步地了解整个过程=) 有没有人能和这样一个例子分享一个链接或资源? 提前谢谢 更新:Java 自定义XAResource(JTA),java,spring,jta,xa,Java,Spring,Jta,Xa,今天,我的团队负责人让我为我们的一个内部产品实现一个定制的XAResource包装器(它提供了类似于SFTP服务器的功能,但它是分布式的,用Java编写的,还有很多附加功能……没关系=) 这里很重要的一点是,我们的应用程序是一个独立的应用程序(因此我需要使用一个嵌入式JTA事务管理器,比如Atomikos),它已经包含Spring、JMS和Hibernate(也必须包含在分布式事务中) 问题是我已经在谷歌上搜索了一段时间,但我还没有找到任何关于实现和配置自定义XAResource实现示例的资源。
这是一个很有用的资源,可以对整个事情进行概述:我总结了以下内容。在我将Bitronix的库和所有源代码添加到我的项目中之后,我看到了一个有趣的EhCache XAResource示例。我检查了它是如何工作的,并复制了逻辑。这之后只剩下一个问题:“如何为事务管理器登记我的资源?”。为了做到这一点,我编写了以下工厂(在我的例子中,我需要使SFTP资源XA感知):
Dmitry,我的情况与需要为当前不支持XA的资源编写自定义XAResource的情况相同。您能否与我共享您为此创建的自定义XAResource代码?我知道这已经有好几年了,但到目前为止我还没有找到任何其他的例子。非常感谢。
@Service
public class XaSftpSessionFactory {
@Autowired
private JtaTransactionManager transactionManager;
public XaSftpSession getSession(final ConnectionSettings settings) {
if (settings == null) {
throw new IllegalArgumentException("The specified SFTP connection settings must be not null.");
}
final XaSftpSession xaSession = new XaSftpSession(settings);
final XaSftpResource xaResource = new XaSftpResource(xaSession);
xaSession.setXaResource(xaResource);
XaSftpResourceProducer.registerXAResource(settings.getName(), xaResource);
try {
Transaction transaction = transactionManager.getTransactionManager().getTransaction();
transaction.enlistResource(xaResource);
transaction.registerSynchronization(
new Synchronization() {
@Override
public void beforeCompletion() {
}
@Override
public void afterCompletion( int status ) {
XaSftpResourceProducer.unregisterXAResource(settings.getName(), xaResource );
}
}
);
} catch (RollbackException | SystemException exception) {
throw new IllegalStateException(
String.format("Can't create an SFTP session for the '%s' instance.", settings.getName()),
exception
);
}
return xaSession;
}
}