我有以下要求:
跟踪neo4j更改并对更改的数据执行异步操作。
将异步过程的结果存储回单独的节点中的Neo。
对于第1步,我实现了TransactionEventHandler并将其注册到服务器插件中,如下所示:
public class MyPlugin extends ServerPlugin{
@Name( "track_change" )
@Description( "Track Neo4j changes")
@PluginTarget( GraphDatabaseService.class )
public void registerEventHandler( @Source GraphDatabaseService graphDb ){
graphDb.registerTransactionEventHandler(new MyTransactionEventHandler());
}
}
这工作得很好。现在,对于步骤2,我想在MyTransactionEventHandler中编写嵌入式代码,如下所示:
private void saveStatus(String status) {
Transaction tx = graphDb.beginTx();
try
{
Label label = DynamicLabel.label("Status");
Node requestNode = graphDb.createNode(label);
requestNode.setProperty(STATUS, status);
tx.success();
}catch(Exception e){
tx.failure();
logger.severe(e.getMessage());
}finally{
tx.close();
}
}
为此,我需要在处理程序中提供GraphDatabaseService的实例。因此,我应该使用GraphDatabaseFactory创建一个新的嵌入式实例,还是通过将其传递给处理程序来使用来自插件的实例。 Neo4j文档指出:
GraphDatabaseService实例可以在多个线程之间共享。但是请注意,您不能创建指向同一数据库的多个实例。
我尝试通过将插件中的一个传递给MyTransactionEventHandler的构造函数来使用,但是有时在创建节点时会导致错误。
java.lang.IllegalStateException: This transaction has already been completed.
被理解为异步操作可能需要更长的时间。在这种情况下,可以创建另一个GraphDatabaseService实例。如果不是,那么推荐的方法是什么。
感谢任何帮助。
最佳答案
哪个tx-event-handler方法中的异常确切出现在哪里?
请分享完整的方法/代码。另外,您的TX上没有close()。
另外,您应该在生命周期中而不是在http方法调用中注册tx处理程序。
您不会创建GraphDatabaseService的新实例,而只是将其传递给您。