今天,我的团队负责人要求我为我们的一种内部产品实现自定义XAResource包装器(它提供了SFTP服务器之类的功能,但它是分布式的,用Java编写的,还有很多其他功能……没关系=)) 。
这里重要的一点是,我们的应用程序是一个独立的应用程序(因此,我需要使用嵌入式的JTA事务管理器,例如Atomikos),其中已经具有Spring,JMS和Hibernate(还必须包含在分布式事务中)。
问题是我已经用Google搜索了一段时间,并且没有通过实施和配置自定义XAResource实现的示例来查找任何资源。
附言实际上,我已经找到了XADisk framework,但最好逐步了解整个过程=)
有人可以通过这样的例子共享链接或资源吗?
提前致谢!
更新:
Threre是有用的资源,可让您大致了解整个情况:Spring documentation
最佳答案
我得出以下结论。在将Bitronix的库以及所有源代码添加到我的项目中之后,我看到了一个有趣的EhCache XAResource示例。我检查了所有工作原理并重复了逻辑。此后仅剩一个问题:“如何为交易经理争取我的资源?”。为此,我编写了以下工厂(在我的情况下,我需要使XFTP感知的SFTP资源):
@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;
}
}