首页 > 解决方案 > Janusgraph 0.3.0 Tinkerpop 3.3.3 java - 使用 GryoMessageSerializerV3d0 添加 Edge 后出现序列化错误

问题描述

在 Java 中添加边后出现以下错误:

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

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

> 序列化程序:- { className:org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV3d0,配置:{ ioRegistries:[org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }} - { className:org.apache.tinkerpop.gremlin .driver.ser.GryoMessageSerializerV3d0,配置:{serializeResultToString:真}} - {类名: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,配置:{ serializeResultToString:true }} - { className:org.apache.tinkerpop.gremlin.driver.ser。 GraphSONMessageSerializerGremlinV2d0,配置:{ioRegistries:[org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry]}} - {类名:org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV1d0,配置:{ioRegistries:[org.janusgraph.graphdb. tinkerpop.JanusGraphIoRegistryV1d0] }} - {类名:org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0,配置:{ ioRegistries:[org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistryV1d0] }}{ 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.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistryV1d0]}} - {类名:org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0,配置:{ioRegistries : [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistryV1d0] }}{ 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.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistryV1d0]}} - {类名:org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0,配置:{ioRegistries : [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistryV1d0] }}GraphSONMessageSerializerGremlinV1d0,配置:{ioRegistries:[org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistryV1d0]}} - {类名:org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0,配置:{ioRegistries:[org.janusgraph.graphdb。 tinkerpop.JanusGraphIoRegistryV1d0] }}GraphSONMessageSerializerGremlinV1d0,配置:{ioRegistries:[org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistryV1d0]}} - {类名:org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0,配置:{ioRegistries:[org.janusgraph.graphdb。 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 处的对等方重置(本机方法)

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

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

标签: janusgraph

解决方案


我认为您需要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();

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

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();
    }
}

而是这样做:

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();
}

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

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

推荐阅读