Neo4j 如何在现有事务中登记XAResource?

Neo4j 如何在现有事务中登记XAResource?,neo4j,Neo4j,我的用例是: 我有一个现有的JTA TransactionManager和一个正在进行的交易。我想在这个事务中将Neo4j登记为XAResource,这样它就可以在适当的2PC中准备/提交 我没有在Neo4j中看到公共XAResource实现;一切似乎都是通过nioneodpersistencesource>neostorexadasource>neostorexconnection.neostorexassource路由的 在JTA事务中,除了由自己的TransactionManager提供的

我的用例是:

我有一个现有的JTA TransactionManager和一个正在进行的交易。我想在这个事务中将Neo4j登记为XAResource,这样它就可以在适当的2PC中准备/提交

我没有在Neo4j中看到公共XAResource实现;一切似乎都是通过nioneodpersistencesource>neostorexadasource>neostorexconnection.neostorexassource路由的

在JTA事务中,除了由自己的TransactionManager提供的事务外,是否有更好的方法将Neo4j纳入JTA事务?我找到的所有测试用例都是“FakeXAResource”[1]

谢谢

S, ALR


[1] 例如,使用JotMastXManagerit

好的,我有一个我认为是Neo4j能够处理的最好的解决方案,尽管我对此并不感到兴奋。:)

这个想法是:

1) 实现Neo4j的AbstractTransactionManager

这个笨重的类是JTA TransactionManager、Neo4j生命周期和其他一些方法的组合;我还不完全清楚其中的一些(例如“getEventIdentifier()”或“doRecovery()”)应该是什么,而且合同似乎过于具体化了。对于Neo4j不是TransactionManager的权威所有者的情况,我不确定我们为什么要在这里使用生命周期方法

2) 实现Neo4j的TransactionManagerProvider

这将允许您创建AbstractTransactionManager实现的新实例,但它受JDK服务SPI的约束,因此您必须提供一个无参数构造函数,并找到其他智能/黑客方式来传递上下文信息

3) 创建META-INF/services/org.neo4j.kernel.impl.transaction.transaction Manager提供程序文件,其中包含步骤2中transaction Manager提供程序impl的FQN内容)

4) 创建新GraphDatabaseService时,传入如下配置:

final GraphDatabaseService graphDatabaseService = new GraphDatabaseFactory().
            newEmbeddedDatabaseBuilder(FILE_NAME_STORAGE).setConfig(
            GraphDatabaseSettings.tx_manager_impl.name(),
            "NAME_OF_YOUR_TXM_PROVIDER")
            .newGraphDatabase();
然后使用不推荐使用的API(GraphDatabaseAPI)访问TransactionManager:

这种方法的真正问题是,我们必须使用Neo4j中的TransactionManager实现,它正在包装我们的RealTM。我想做的是使用我的TM并将Neo4j登记为XAResource

因此,我仍然没有找到一种方法来做到这一点,从Neo4j测试套件来看,我认为在他们提供的任何XAResource支持下,目前都不可能做到这一点

绝对愿意并希望得到纠正!:)

但是,如果没有我上面提到的要点,所附的gist可以工作,并且显示了使用外部TransactionManager(Narayana,来自JBoss的我们)作为支持实现的Neo4j

S,
ALR

我怀疑这可能与TransactionManagerProvider有关,类似的做法如下:
// Get at Neo4j's view of the TransactionManager
final TransactionManager tm = ((GraphDatabaseAPI)   graphDatabaseService).getDependencyResolver().resolveDependency(TransactionManager.class);
tm.begin();
final Transaction tx = tm.getTransaction();