好的,我有一个解决方案,我认为这是 Neo4j 可以处理的最好的解决方案,尽管我对此并不感到兴奋。 :)
https://gist.github.com/ALRubinger/b584065d0e7da251469a https://gist.github.com/ALRubinger/b584065d0e7da251469a
想法是这样的:
1)实现Neo4j的抽象TransactionManager
这个笨重的类是 JTA TransactionManager、Neo4j Lifecycle 和其他一些方法的组合;我并不完全清楚其中一些(例如“getEventIdentifier()”或“doRecovery()”)的用途,并且合同感觉过度指定。我不确定为什么在 Neo4j 不是 TransactionManager 的权威所有者的情况下我们需要生命周期方法。
2)实现Neo4j的TransactionManager Provider
这将允许您创建 AbstractTransactionManager 实现的新实例,但它受 JDK 服务 SPI 绑定,因此您必须提供无参数构造函数并找到一些其他智能/黑客方式来传递上下文信息。
3) 创建一个 META-INF/services/org.neo4j.kernel.impl.transaction.TransactionManagerProvider 文件,其中包含步骤 2) 中 TransactionManagerProvider 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:
// Get at Neo4j's view of the TransactionManager
final TransactionManager tm = ((GraphDatabaseAPI) graphDatabaseService).getDependencyResolver().resolveDependency(TransactionManager.class);
tm.begin();
final Transaction tx = tm.getTransaction();
这种方法的真正问题是我们必须使用 Neo4j 的 TransactionManager 实现,它包装了我们真正的 TM。我想要做的是使用我的 TM 并将 Neo4j 作为 XAResource。
所以我仍然没有找到一种方法来做到这一点,并且从 Neo4j 测试套件来看,我认为目前他们提供的任何 XAResource 支持都不可能做到这一点。
绝对愿意并希望得到指正! :)
但是如果没有达到我上面提到的要点,附加的要点可以工作并显示 Neo4j 使用外部 TransactionManager(Narayana,来自我们 JBoss)作为支持实现。
S,
ALR