我要求:
对于第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实例是可以的。如果没有,那么建议的方法是什么。
感谢任何帮助。
答案 0 :(得分:1)
在哪个tx-event-handler方法中出现异常的确切位置? 请分享完整的方法/代码。你的tx也没有close()。
此外,您应该在生命周期中注册tx处理程序,而不是在http方法调用中注册。
您不会创建GraphDatabaseService的新实例,只是传递给您。