java中的并发gremlin服务器和图形查询

java中的并发gremlin服务器和图形查询,java,server,gremlin,tinkerpop3,Java,Server,Gremlin,Tinkerpop3,我正在用TinkerPop3编写一个Java应用程序。它与Neo4j图形通信,并使用Neo4j Gremlin 3.0.0.M7库通过Gremlin发送读/写查询 同时,我想使用gremlinserver3.0.0.M7通过HTTP提供此图。另外,这些操作工作得非常好。但是,由于不允许多个连接(即GremlinServer对象和Java代码都试图获得图形上的锁),因此这似乎不可能同时进行 当然,解决方法可能涉及从Java程序中创建客户机并将其连接到服务器。然而,我宁愿消除这带来的通信开销 最大的

我正在用TinkerPop3编写一个Java应用程序。它与Neo4j图形通信,并使用
Neo4j Gremlin 3.0.0.M7
库通过Gremlin发送读/写查询

同时,我想使用
gremlinserver3.0.0.M7
通过HTTP提供此图。另外,这些操作工作得非常好。但是,由于不允许多个连接(即
GremlinServer
对象和Java代码都试图获得图形上的锁),因此这似乎不可能同时进行

当然,解决方法可能涉及从Java程序中创建客户机并将其连接到服务器。然而,我宁愿消除这带来的通信开销

最大的问题是:这可能吗

为了完整起见,这里是我的最小代码。请注意,我的
gremlin-server-neo4j.yaml
是指标准包含的
neo4j empty.properties
文件,其中包含与我的Java代码中的Neo4jGraph对象相同的neo4j图形数据目录(即
/tmp/neo4j

最后,例外情况是:

Exception in thread "main" java.lang.RuntimeException: Error starting org.neo4j.kernel.EmbeddedGraphDatabase, /tmp/neo4j
    at com.tinkerpop.gremlin.neo4j.structure.Neo4jGraph.<init>(Neo4jGraph.java:160)
    at com.tinkerpop.gremlin.neo4j.structure.Neo4jGraph.open(Neo4jGraph.java:175)
    at com.tinkerpop.gremlin.neo4j.structure.Neo4jGraph.open(Neo4jGraph.java:184)
    at org.test.Main.start(Main.java:33)
    at org.test.Main.main(Main.java:15)
Caused by: java.lang.RuntimeException: Error starting org.neo4j.kernel.EmbeddedGraphDatabase, /tmp/neo4j
    at org.neo4j.kernel.InternalAbstractGraphDatabase.run(InternalAbstractGraphDatabase.java:366)
    at org.neo4j.kernel.EmbeddedGraphDatabase.<init>(EmbeddedGraphDatabase.java:59)
    at org.neo4j.graphdb.factory.GraphDatabaseFactory$1.newDatabase(GraphDatabaseFactory.java:91)
    at org.neo4j.graphdb.factory.GraphDatabaseBuilder.newGraphDatabase(GraphDatabaseBuilder.java:181)
    at com.tinkerpop.gremlin.neo4j.structure.Neo4jGraph.<init>(Neo4jGraph.java:133)
    ... 4 more
Caused by: org.neo4j.kernel.lifecycle.LifecycleException: Component 'org.neo4j.kernel.StoreLockerLifecycleAdapter@67ec8477' was successfully initialized, but failed to start. Please see attached cause exception.
    at org.neo4j.kernel.lifecycle.LifeSupport$LifecycleInstance.start(LifeSupport.java:513)
    at org.neo4j.kernel.lifecycle.LifeSupport.start(LifeSupport.java:115)
    at org.neo4j.kernel.InternalAbstractGraphDatabase.run(InternalAbstractGraphDatabase.java:343)
    ... 8 more
Caused by: org.neo4j.kernel.StoreLockException: Unable to obtain lock on store lock file: /tmp/neo4j/store_lock. Please ensure no other process is using this database, and that the directory is writable (required even for read-only access)
    at org.neo4j.kernel.StoreLocker.checkLock(StoreLocker.java:82)
    at org.neo4j.kernel.StoreLockerLifecycleAdapter.start(StoreLockerLifecycleAdapter.java:44)
    at org.neo4j.kernel.lifecycle.LifeSupport$LifecycleInstance.start(LifeSupport.java:507)
    ... 10 more
Caused by: java.io.IOException: Unable to lock org.neo4j.kernel.impl.nioneo.store.StoreFileChannel@baf1bb3
    at org.neo4j.kernel.impl.nioneo.store.FileLock.wrapFileChannelLock(FileLock.java:38)
    at org.neo4j.kernel.impl.nioneo.store.FileLock.getOsSpecificFileLock(FileLock.java:93)
    at org.neo4j.kernel.DefaultFileSystemAbstraction.tryLock(DefaultFileSystemAbstraction.java:93)
    at org.neo4j.kernel.StoreLocker.checkLock(StoreLocker.java:74)
    ... 12 more
线程“main”java.lang.RuntimeException中的异常:启动org.neo4j.kernel.EmbeddedGraphDatabase时出错,/tmp/neo4j 位于com.tinkerpop.gremlin.neo4j.structure.Neo4jGraph.(Neo4jGraph.java:160) 位于com.tinkerpop.gremlin.neo4j.structure.Neo4jGraph.open(Neo4jGraph.java:175) 位于com.tinkerpop.gremlin.neo4j.structure.Neo4jGraph.open(Neo4jGraph.java:184) 位于org.test.Main.start(Main.java:33) 位于org.test.Main.Main(Main.java:15) 原因:java.lang.RuntimeException:启动org.neo4j.kernel.EmbeddedGraphDatabase时出错,/tmp/neo4j 位于org.neo4j.kernel.InternalAbstractGraphDatabase.run(InternalAbstractGraphDatabase.java:366) 位于org.neo4j.kernel.EmbeddedGraphDatabase。(EmbeddedGraphDatabase.java:59) 位于org.neo4j.graphdb.factory.GraphDatabaseFactory$1.newDatabase(GraphDatabaseFactory.java:91) 位于org.neo4j.graphdb.factory.GraphDatabaseBuilder.newGraphDatabase(GraphDatabaseBuilder.java:181) 位于com.tinkerpop.gremlin.neo4j.structure.Neo4jGraph.(Neo4jGraph.java:133) ... 4更多 原因:org.neo4j.kernel.lifecycle.LifecycleException:组件“org.neo4j.kernel”。StoreLockerLifecycleAdapter@67ec8477'已成功初始化,但启动失败。请参阅附件中的原因例外。 位于org.neo4j.kernel.lifecycle.LifeSupport$LifecycleInstance.start(LifeSupport.java:513) 位于org.neo4j.kernel.lifecycle.LifeSupport.start(LifeSupport.java:115) 位于org.neo4j.kernel.InternalAbstractGraphDatabase.run(InternalAbstractGraphDatabase.java:343) ... 8个以上 原因:org.neo4j.kernel.storelock异常:无法获取存储锁文件的锁:/tmp/neo4j/store\u lock。请确保没有其他进程使用此数据库,并且目录是可写的(即使是只读访问也需要) 位于org.neo4j.kernel.StoreLocker.checkLock(StoreLocker.java:82) 位于org.neo4j.kernel.storeLockerLifecyLeadapter.start(storeLockerLifecyLeadapter.java:44) 位于org.neo4j.kernel.lifecycle.LifeSupport$LifecycleInstance.start(LifeSupport.java:507) ... 10多 原因:java.io.IOException:无法锁定org.neo4j.kernel.impl.nioneo.store。StoreFileChannel@baf1bb3 位于org.neo4j.kernel.impl.nioneo.store.FileLock.wrapFileChannelLock(FileLock.java:38) 位于org.neo4j.kernel.impl.nioneo.store.FileLock.getOsSpecificFileLock(FileLock.java:93) 位于org.neo4j.kernel.DefaultFileSystemAbstraction.tryLock(DefaultFileSystemAbstraction.java:93) 位于org.neo4j.kernel.StoreLocker.checkLock(StoreLocker.java:74) ... 还有12个
正如您所发现的,您试图做的事情不会起作用,因为两个单独的进程无法在嵌入式
Neo4jGraph
上工作。目前,您无法从
GremlinServer
对象访问已配置的图形实例,我不确定我是否会改变这一点,因为我不完全确定这是一项对所有人都有用的功能

在我看来,您需要的是一种“初始化”图形实例的方法。如果是这样,那么Gremlin服务器提供了一种方法。您可以在yaml文件中提供一个初始化脚本(下面是来自
conf/gremlin-server-classic.yaml
的一个片段,它与gremlin-server发行版打包在一起)

请注意“scripts”键,它允许您提供要执行的脚本文件。这些脚本将允许您访问“g”(或您配置的任何图形)。对于本例,
scripts/generate classic.groovy
只有:

TinkerFactory.generateClassic(g)

通过这种方式,您可以在
图形上完成所有初始化工作,当它启动时,最终将由Gremlin Server托管,然后只需使用
bin/Gremlin Server.sh以标准方式启动即可。感谢您的快速响应!这是否意味着在指定的脚本完成运行之前,服务器不会开始服务?在我的特定应用程序中,我希望执行一个与服务器同时运行的脚本,但据我所知,这样的脚本只是一个初始化步骤(在完成之前保持锁,之后允许服务器获取锁)。使这样的脚本永远运行会导致服务器永远无法启动吗?初始化脚本将一直阻塞,直到它完成执行。因此,服务器在完成之前不会开始服务。如果您想让该脚本在服务器生命周期内持续运行(并避免阻塞),我想您必须在脚本中启动一个单独的线程。问题是如何很好地停止该线程,因为不会有一个触发器来知道服务器何时关闭。我并不反对对Gremlin服务器进行更改,以提供该钩子作为可从脚本访问的绑定。请看这个问题:好的,那么我现在将使用客户机方法。谢谢你的帮助
scriptEngines: {
  gremlin-groovy: {
    imports: [java.lang.Math],
    staticImports: [java.lang.Math.PI],
    scripts: [scripts/generate-classic.groovy]}}
TinkerFactory.generateClassic(g)