自定义XAResource(JTA)

时间:2014-11-27 17:47:49

标签: java spring jta xa

今天我的团队负责人要求我为我们的一个内部产品实现一个自定义XAResource包装器(它提供的功能类似于SFTP服务器,但它是分布式的,用Java编写并且还有很多其他功能......没关系=))。

这里重要的一点是,我们的应用程序是独立的(因此我需要使用像嵌入式 JTA事务管理器),它已经具有Spring,JMS和Hibernate(必须包含它)在内部的分布式交易中。

问题是我已经谷歌搜索了一段时间,我没有设法找到任何资源与实现和配置自定义XAResource实现的示例。 附:实际上,我找到了XADisk framework,但最好逐步了解整个过程=)

有人可以用这样的例子分享链接或资源吗? 提前致谢!

更新

Threre是一个有用的资源,可以全面了解整个事情:Spring documentation

1 个答案:

答案 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;
   }
}