Janusgraph 0.3.0 Tinkerpop 3.3.3 java - ошибка сериализации после добавления Edge с помощью GryoMessageSerializerV3d0 - PullRequest
0 голосов
/ 08 ноября 2018

Я получаю следующую ошибку после добавления ребра в 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: обнаружен незарегистрированный идентификатор класса: 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 выглядит следующим образом:

> сериализаторы: - {className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV3d0, config: {ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry]}} - {className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV3d0, config: {serializeResultToString: true}} - {className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV3d0, config: {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, config: {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, 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.GraphSONMessageSerializerV1d0, config: {ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistryV1d0]}}

Примерно в то же время на сервере регистрируется следующая ошибка, которая, по-видимому, связана:

> 105869 2018-11-08 06: 10: 44,659 [gremlin-server-worker-1] WARN io.netty.channel.DefaultChannelPipeline - Возникло событие exceptionCaught (), которое достигло конца конвейера. Обычно это означает, что последний обработчик в конвейере не обработал исключение. java.io.IOException: сброс соединения по пиру at sun.nio.ch.FileDispatcherImpl.read0 (собственный метод)

Насколько я вижу, мои утки выстроены в соответствие с версиями сериализатора, но явно что-то упустили. Любая помощь с благодарностью!

Код можно увидеть здесь: https://gist.github.com/ptclarke/45472fa5c268a6e8441e4c35615194aa

1 Ответ

0 голосов
/ 08 ноября 2018

Я думаю, вам нужно 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(); 
}
...