今天我的团队负责人要求我为我们的一个内部产品实现一个自定义XAResource包装器(它提供的功能类似于SFTP服务器,但它是分布式的,用Java编写并且还有很多其他功能......没关系=))。
这里重要的一点是,我们的应用程序是独立的(因此我需要使用像
问题是我已经谷歌搜索了一段时间,我没有设法找到任何资源与实现和配置自定义XAResource实现的示例。 附:实际上,我找到了XADisk framework,但最好逐步了解整个过程=)
有人可以用这样的例子分享链接或资源吗? 提前致谢!
更新:
Threre是一个有用的资源,可以全面了解整个事情:Spring documentation
答案 0 :(得分:2)
我最终得到了以下内容。在我使用所有源代码将Bitronix库添加到项目之后,我看到了一个有趣的EhCache XAResource示例。我检查了它是如何工作的并重复了逻辑。在此之后剩下的唯一一个问题是:“如何为事务管理器登记我的资源?”。为了做到这一点,我编写了以下工厂(在我的情况下,我需要使SFTP资源能够识别XA):
@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;
}
}