Janusgraph 0.3.0 Tinkerpop 3.3.3 java - 使用 GryoMessageSerializerV3d0 添加 Edge 后出现序列化错误

ptc*_*ptc 3 janusgraph

在 Java 中添加边缘后,我收到以下错误:

16:40:44.267 [gremlin-driver-loop-1] WARN org.apache.tinkerpop.gremlin.driver.MessageSerializer - 响应 [PooledUnsafeDirectByteBuf(ridx: 98, widx: 98, cap: 98)] 无法被组织反序列化.apache.tinkerpop.gremlin.driver.ser.AbstractGryoMessageSerializerV3d0。org.apache.tinkerpop.shaded.kryo.KryoException:遇到未注册的类 ID:65536 序列化跟踪:id (org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceEdge) 在 org.apache.tinkerpop.gremlin.structure。 io.gryo.AbstractGryoClassResolver.readClass(AbstractGryoClassResolver.java:148)

Janusgraph 版本为 0.3.0,Tinkerpop 版本为 3.3.3,Janusgraph 序列化配置如下:

> 序列化程序:- { 类名:org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV3d0,配置:{ ioRegistries:[org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }} - { 类名:org.apache.tinkerpop.gremlin .driver.ser.GryoMessageSerializerV3d0, 配置: { serializeResultToString: true }} - { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV3d0, 配置: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] } } # 向后兼容的旧序列化版本: - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }} - { className: org .apache.tinkerpop.gremlin.driver.ser.GryoLiteMessageSerializerV1d0,配置:{ioRegistries:[org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }} - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { serializeResultToString: true }} - { className: org.apache.tinkerpop.gremlin.driver.ser. GraphSONMessageSerializerGremlinV2d0, 配置: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }} - { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV1d0, 配置: { ioRegistries: [org.org.db. tinkerpop.JanusGraphIoRegistryV1d0] }} - { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistryV1d0] }}{ serializeResultToString: true }} - { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV2d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }} - { className: org.apache. tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV1d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistryV1d0] }} - { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerconfigiesV1d0, : [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistryV1d0] }}{ serializeResultToString: true }} - { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV2d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }} - { className: org.apache. tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV1d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistryV1d0] }} - { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerconfigiesV1d0, : [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistryV1d0] }}GraphSONMessageSerializerGremlinV1d0,配置:{ioRegistries:[org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistryV1d0]}} - { className:org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0,配置:{ioRegistries:[org.org.janus. tinkerpop.JanusGraphIoRegistryV1d0] }}GraphSONMessageSerializerGremlinV1d0,配置:{ioRegistries:[org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistryV1d0]}} - { className:org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0,配置:{ioRegistries:[org.org.janus. tinkerpop.JanusGraphIoRegistryV1d0] }}

大约在同一时间,服务器上记录了以下错误并且似乎是相关的:

> 105869 2018-11-08 06:10:44,659 [gremlin-server-worker-1] 警告 io.netty.channel.DefaultChannelPipeline - 一个 exceptionCaught() 事件被触发,它到达管道的尾部。这通常意味着管道中的最后一个处理程序没有处理异常。java.io.IOException: 连接由 sun.nio.ch.FileDispatcherImpl.read0(Native Method) 处的对等方重置

据我所知,我的鸭子在匹配的序列化器版本方面排成一列,但显然一定错过了一些东西。非常感谢任何帮助!

代码可以在这里看到:https : //gist.github.com/ptclarke/45472fa5c268a6e8441e4c35615194aa

ste*_*tte 6

我认为您需要JanusGraphIoRegistry在客户端注册:

GryoMapper.Builder builder = GryoMapper.build().
                                        addRegistry(JanusGraphIoRegistry.getInstance());

GryoMessageSerializerV3d0 serializer = new GryoMessageSerializerV3d0(builder);
Cluster cluster = Cluster.build().
                          addContactPoint(host).
                          port(port).
                          serializer(serializer).
                          create();
Run Code Online (Sandbox Code Playgroud)

作为对您的代码的一些额外建议。考虑避免大量这样的小更新:

public void updateVertex(Vertex v, Map<Object, Object> propertyMap) {
    for(Entry<Object, Object> e : propertyMap.entrySet()) {
        g.V(v).property(e.getKey(), e.getValue()).next();
    }
}
Run Code Online (Sandbox Code Playgroud)

而是这样做:

public void updateVertex(Vertex v, Map<Object, Object> propertyMap) {
    GraphTraversal<Vertex,Vertex> t = g.V(v);
    for(Entry<Object, Object> e : propertyMap.entrySet()) {
        t = t.property(e.getKey(), e.getValue());
    }
    t.iterate();
}
Run Code Online (Sandbox Code Playgroud)

您还可以简化“添加边缘”代码:

public Edge addEdge(String label, Vertex from, Vertex to) {         
    return g.V(from).addE(label).to(to).next(); 
}
Run Code Online (Sandbox Code Playgroud)