0

Have a Java servlet running using a Tomcat server. So when the servlet starts, I would like the client to connect to a RMI registry (Port 33996). The client is initialized during the init() of the servlet. However, for some reason, it is unable to connect to the server

Server code

 @Override
    public void startRMIRegistry(CentralServer server){
        try {
            AsyncLogger.log("Setting up RMI Registry.....");
            Registry registry = LocateRegistry.createRegistry(
                Integer.parseInt(ServerConfigUtils.getProperty(ServerConfigUtils.PORT)));
            registry.rebind(ServerConfigUtils.getProperty(ServerConfigUtils.NAME), server);

        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }

Client code

private ICentralServer getServerConnection() {
        String serverHost = ServerConfigUtils.getProperty(ServerConfigUtils.HOST);
        Integer serverPort = Integer.valueOf(ServerConfigUtils.getProperty(ServerConfigUtils.PORT));
        String serverName = ServerConfigUtils.getProperty(ServerConfigUtils.NAME);

        Integer failureCount = 0;

        while (failureCount < SERVER_ACTION_ATTEMPTS) {
            try {
                return (ICentralServer)
                    LocateRegistry.getRegistry(serverHost, serverPort).lookup(serverName);
            } catch (Exception e) {
                failureCount++;
                continue;
            }
        }

        AsyncLogger.log("Failed to connect to central server, giving up");
        throw new RuntimeException();
    }

Servlet

 @Override
    public void init() throws ServletException {

        try {
            client = new LabClient();
        } catch (Exception e) {
            e.printStackTrace();
        }
        super.init();
    }

Error

INFO: Starting ProtocolHandler ["http-nio-8080"]
sg.gov.moh.exceptions.CannotReachServerException: java.lang.NullPointerException
        at sg.gov.moh.client.LabClient.<init>(LabClient.java:366)
        at launcher.servlet.MainServlet.init(MainServlet.java:36)
        at javax.servlet.GenericServlet.init(GenericServlet.java:158)
        at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1152)
        at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1097)
        at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:768)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:133)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:544)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:364)
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:624)
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:831)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1651)
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NullPointerException
        at sg.gov.moh.centralServer.CentralServer.pingOrPrune(CentralServer.java:318)
        at sg.gov.moh.centralServer.CentralServer.registerLaboratory(CentralServer.java:297)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:357)
        at sun.rmi.transport.Transport$1.run(Transport.java:200)
        at sun.rmi.transport.Transport$1.run(Transport.java:197)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
        at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:573)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:834)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:688)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:687)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)
        at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:303)
        at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:279)
        at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:163)
        at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:235)
        at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:180)
        at com.sun.proxy.$Proxy5.registerLaboratory(Unknown Source)
        at sg.gov.moh.client.LabClient.registerCallback(LabClient.java:69)
        at sg.gov.moh.client.LabClient.<init>(LabClient.java:364)
        ... 21 more

Had my peers tried this code, they were all able to connect successfully. Have tried toggling off firewall, setting inbound rules to the port but to no avail

Willows
  • 1
  • 1

1 Answers1

-1

Found the solution, I ran mvn clean package at the parent maven directory, previously I was rebuilding the sub-modules invidually at sub-module level, which corrupted the bytecode.

|- Parent 
|   |--Sub-module a 
|   |--Sub-module b
|
|
Willows
  • 1
  • 1
  • It didn't 'corrupt the bytecode'. It just built it in a self-inconsistent state. – user207421 Jul 30 '21 at 06:25
  • @user207421 yes you’re right, it wasn’t corrupt, excuse my poor wording, the modules were built separately from one another and hence it resulted in inconsistency. – Willows Jul 31 '21 at 07:10