今天,我的团队负责人要求我为我们的一种内部产品实现自定义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;
   }
}

07-26 04:08