Java 自定义XAResource(JTA)

Java 自定义XAResource(JTA),java,spring,jta,xa,Java,Spring,Jta,Xa,今天,我的团队负责人让我为我们的一个内部产品实现一个定制的XAResource包装器(它提供了类似于SFTP服务器的功能,但它是分布式的,用Java编写的,还有很多附加功能……没关系=) 这里很重要的一点是,我们的应用程序是一个独立的应用程序(因此我需要使用一个嵌入式JTA事务管理器,比如Atomikos),它已经包含Spring、JMS和Hibernate(也必须包含在分布式事务中) 问题是我已经在谷歌上搜索了一段时间,但我还没有找到任何关于实现和配置自定义XAResource实现示例的资源。

今天,我的团队负责人让我为我们的一个内部产品实现一个定制的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;
   }
}