Neo4j插件

时间:2015-07-27 06:10:50

标签: java neo4j

我要求:

  1. 跟踪neo4j更改并对更改的数据执行异步操作。
  2. 在单独的节点中将异步进程的结果存储回Neo。
  3. 对于第1步,我实现了TransactionEventHandler并将其作为

    注册在Server插件中
    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实例是可以的。如果没有,那么建议的方法是什么。

    感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

在哪个tx-event-handler方法中出现异常的确切位置? 请分享完整的方法/代码。你的tx也没有close()。

此外,您应该在生命周期中注册tx处理程序,而不是在http方法调用中注册。

您不会创建GraphDatabaseService的新实例,只是传递给您。