我有以下要求:


跟踪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的新实例,而只是将其传递给您。

10-08 16:03