Question
· Dec 2, 2023

Java Gateway connection fails for the Stateless Service example

Hello all,

I am trying to start java gateway and constantly getting an error in terminal:
"%RemoteService+3^%Net.Remote.Gateway.1 *%Exception.StatusException ERROR #5023: Remote Gateway Error: TCP error on port '55555', ensure there is an Object Gateway running on this port". I've checked jvm and it is running properly, telnet also is able to connect to the port.

Has anyone encountered this issue before?

$ZV: IRIS for UNIX (Ubuntu Server LTS for x86-64 Containers) 2023.3 (Build 254U) Wed Nov 8 2023 13:03:30 EST
Discussion (2)2
Log in or sign up to continue

Hi Anna,

the error you are getting is due to the missing (not started) Java Gateway using port 55555.
You can get your sample working starting the default java gateway using the Management portal System Administration -> Configuration -> Connectivity -> External Language Servers, there you can customize the "%Java Server" and start it.
Note that the default "%Java Server" uses port 53273, so if you want to use it, you need to change 55555 with 53273, or you can define and start your own Java Server using port 55555.

Please note that you are using a legacy feature that should work for backward compatibility but it's no longer documented (the documentation page you have linked before editing your question is from Ensemble 2018, not IRIS).
The new documented way to call external languages, including Java, is using InterSystems External Servers ($system.external)

The following is a rewrite of the old version sample described in this page using the new External Server for Java that implement the same functionality.

    Set paramsJSON="{""origin"" : ""philadelphia"", ""destination"" : ""boston""}"
    ; Get the Java Gateway, if needed this will also start the gateway.
    ; You may need to configure Java Home from Management Portal:
    ; System Administration -> Configuration -> Connectivity -> External Language Servers
    ; there you can cofigure the "%Java Server" 
    Set jgw=$system.external.getJavaGateway()
    Do jgw.addToPath("/path/to/jars/gson-2.10.1.jar")

    Set inputJSON=jgw.new("com.google.gson.JsonParser").parse(paramsJSON)
    Set jsonObject = inputJSON.getAsJsonObject()
    Set origin = jsonObject.get("origin").toString()
    Set destination = jsonObject.get("destination").toString()
    
    Set URLsource=jgw.new("java.net.URL","http://maps.googleapis.com/maps/api/directions/json?origin="_origin_"&destination="_destination_"&sensor=false")

    Set in=jgw.new("java.io.BufferedReader",jgw.new("java.io.InputStreamReader",URLsource.openStream(),"UTF-8"))
    Set outputJSON=jgw.new("com.google.gson.JsonParser").parse(in)
    Do in.close()
    Set jsonObject = outputJSON.getAsJsonObject()
    Set response = jsonObject.toString()
    ; just for testing write the output to terminal
    Write response
    

Please note that this sample does not require any Java side code, just the libraries/jars used in the sample.
For complex Java code a Java side wrapper class (or classes) can be developed to simplify the IRIS/Java interface.

HTH
Enrico