java中的并发gremlin服务器和图形查询
我正在用TinkerPop3编写一个Java应用程序。它与Neo4j图形通信,并使用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程序中创建客户机并将其连接到服务器。然而,我宁愿消除这带来的通信开销 最大的
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)