docker-containerjanusgraphtinkerpop3gremlin-servergremlin-java

How To Connect To JanusGraph In Java with AnonymousTraversalSource


Problem

Why am I unable-to-connect to JanusGraph-Server on localhost:8182?
Using Java-17, TinkerPop3 Gremlin, and Janusgraph:latest.

Reproduction

Steps

  1. Download-and-Install Docker (Windows)
  2. Create-and-Startup JanusGraph Docker-container docker run -it -p 8182:8182 janusgraph/janusgraph Gremlin running on Docker-container of Janusgraph-image
  3. Create-and-Run Java-Maven Project
  4. Results
    1. Expected: No errors and that the rest of the code runs
    2. Actual: Runtime Error: IllegalStateException Could not establish serializer - org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV3d0

Logs

Exception in thread "main" java.lang.IllegalStateException: java.lang.reflect.InvocationTargetException
    at org.apache.tinkerpop.gremlin.process.remote.RemoteConnection.from(RemoteConnection.java:73)
    at org.apache.tinkerpop.gremlin.process.traversal.AnonymousTraversalSource.withRemote(AnonymousTraversalSource.java:76)
    at org.apache.tinkerpop.gremlin.process.traversal.AnonymousTraversalSource.withRemote(AnonymousTraversalSource.java:66)
    at Main.main(Main.java:10)
Caused by: java.lang.reflect.InvocationTargetException
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
    at org.apache.tinkerpop.gremlin.process.remote.RemoteConnection.from(RemoteConnection.java:71)
    ... 3 more
Caused by: java.lang.IllegalStateException: java.lang.IllegalStateException: Could not establish serializer - org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0
    at org.apache.tinkerpop.gremlin.driver.remote.DriverRemoteConnection.<init>(DriverRemoteConnection.java:84)
    ... 9 more
Caused by: java.lang.IllegalStateException: Could not establish serializer - org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0
    at org.apache.tinkerpop.gremlin.driver.Cluster.getBuilderFromSettings(Cluster.java:228)
    at org.apache.tinkerpop.gremlin.driver.Cluster.build(Cluster.java:173)
    at org.apache.tinkerpop.gremlin.driver.Cluster.open(Cluster.java:265)
    at org.apache.tinkerpop.gremlin.driver.remote.DriverRemoteConnection.<init>(DriverRemoteConnection.java:80)
    ... 9 more

Process finished with exit code 1

Code

│   pom.xml
├───src
│   ├───main
│   │   ├───java
│   │   │       Main.java
│   │   │
│   │   └───resources
│   │       │   log4j2.xml
│   │       │
│   │       ├───conf
│   │       │       remote-graph.properties
│   │       │       remote-objects.yaml

Main.java

import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;

import static org.apache.tinkerpop.gremlin.process.traversal.AnonymousTraversalSource.traversal;

public class Main {
    public static void main(String[] args) throws Exception {
        GraphTraversalSource g = traversal().withRemote("src/main/resources/conf/remote-graph.properties");
    }
}

remote-graph.properties

gremlin.remote.remoteConnectionClass=org.apache.tinkerpop.gremlin.driver.remote.DriverRemoteConnection
gremlin.remote.driver.clusterFile=src/main/resources/conf/remote-objects.yaml
gremlin.remote.driver.sourceName=g

###remote-objects.yaml

hosts: [localhost]
port: 8182
serializer: {
  className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0,
  config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }}

pom.xml

    <dependencies>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j2-impl</artifactId>
            <version>2.20.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tinkerpop</groupId>
            <artifactId>gremlin-core</artifactId>
            <version>3.6.2</version>
        </dependency>
<!--        <dependency>-->
<!--            <groupId>org.janusgraph</groupId>-->
<!--            <artifactId>janusgraph-core</artifactId>-->
<!--            <version>1.0.0-20230424-065649.dcd3240</version>-->
<!--        </dependency>-->
        <!-- https://mvnrepository.com/artifact/org.janusgraph/janusgraph-core -->
        <dependency>
            <groupId>org.janusgraph</groupId>
            <artifactId>janusgraph-core</artifactId>
            <version>0.6.4-20230429-020227.dc3f877</version>
        </dependency>
    </dependencies>

Update

Thanks Marc! This did fix my issue!

enter image description here


Solution

  • The remote-objects.yaml for janusgraph-0.6.3 reads as follows (with a different version for the serializer):

        hosts: [localhost]
        port: 8182
        serializer: {
            className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV3d0,
            config: {ioRegistries:[org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry]}
        }
    

    [Edited after comments] janusgraph-1.0.0.rc2 reads:

        hosts: [localhost]
        port: 8182
        serializer: {
            className: org.apache.tinkerpop.gremlin.driver.ser.GraphBinaryMessageSerializerV1, 
            config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }
        }
    

    Your java project uses janusgraph-1.0.0.rc2 while the gremlin server in the Docker container uses janusgraph-0.6.3 (latest does not include release candidates). Generally, you cannot mix minor versions for gremlin-driver and gremlin server.