Search code examples
javatomcatcentoswar

Trying to start a new app from war file I get java.net.BindException: Address already in use


Our server has already two running apps which are running properly in a centOS server using tomcat7.

I uploaded a new war file with a new app and then:

sh ./shutdown.sh
sh ./startup.sh

When I'm trying to run an API from postman using an endpoint of the new app, then in server's log file I get:

07-Feb-2020 16:57:22.925 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [15,277] milliseconds
07-Feb-2020 16:57:22.927 SEVERE [main] org.apache.catalina.core.StandardServer.await Failed to create server shutdown socket on address [localhost] and port [8005] (base port [8005] and offset [0])
    java.net.BindException: Address already in use (Bind failed)
        at java.net.PlainSocketImpl.socketBind(Native Method)
        at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:387)
        at java.net.ServerSocket.bind(ServerSocket.java:390)
        at java.net.ServerSocket.<init>(ServerSocket.java:252)
        at org.apache.catalina.core.StandardServer.await(StandardServer.java:584)
        at org.apache.catalina.startup.Catalina.await(Catalina.java:721)
        at org.apache.catalina.startup.Catalina.start(Catalina.java:667)
        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 org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:343)
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:474)
07-Feb-2020 16:57:22.927 INFO [main] org.apache.coyote.AbstractProtocol.pause Pausing ProtocolHandler ["http-nio-8080"]
07-Feb-2020 16:57:22.927 INFO [main] org.apache.coyote.AbstractProtocol.pause Pausing ProtocolHandler ["ajp-nio-8009"]
07-Feb-2020 16:57:22.927 INFO [main] org.apache.catalina.core.StandardService.stopInternal Stopping service [Catalina]
07-Feb-2020 16:57:23.050 WARNING [1] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [cef-authentication] appears to have started a thread named [mysql-cj-abandoned-connection-cleanup] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
07-Feb-2020 16:57:23.054 INFO [1] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["http-nio-8080"]
07-Feb-2020 16:57:23.054 INFO [1] org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler ["http-nio-8080"]
07-Feb-2020 16:57:23.054 INFO [1] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["ajp-nio-8009"]
07-Feb-2020 16:57:23.054 INFO [1] org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler ["ajp-nio-8009"]
07-Feb-2020 16:57:23.059 INFO [17] org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading Illegal access: this web application instance has been stopped already. Could not load [java.lang.ClassLoader]. The following stack trace is thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access.
    java.lang.IllegalStateException: Illegal access: this web application instance has been stopped already. Could not load [java.lang.ClassLoader]. The following stack trace is thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access.
        at org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading(WebappClassLoaderBase.java:1385)
        at org.apache.catalina.loader.WebappClassLoaderBase.checkStateForClassLoading(WebappClassLoaderBase.java:1373)
        at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1226)
        at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1188)
        at com.mysql.cj.jdbc.AbandonedConnectionCleanupThread.checkThreadContextClassLoader(AbandonedConnectionCleanupThread.java:117)
        at com.mysql.cj.jdbc.AbandonedConnectionCleanupThread.run(AbandonedConnectionCleanupThread.java:84)
        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)

Do you know how to fix this without interrupting the other apps?


Solution

  • This warning means that your applications is attempting to listen on a port (localhost:8005 in your case) that is already in use by another process.

    • If that port is intentionally in use by another application then you can do nothing about it (you can not have multiple servers on the same port). So you should change the port of this application (eg to 8006)
    • If that port should not be in use, for example is in use due to an improperly ended application that have left running processes use netstat to find that process and kill it. Then start your application again.