Excepción de enlace de dirección en Tomcat
java-8 (1)
Estamos ejecutando la aplicación web Java 8 en el servidor Apache Tomcat 8.0.36 desde hace 1 año. En los últimos días, a veces, cuando reiniciamos el servidor Tomcat, la aplicación no funciona. Los registros muestran una excepción de enlace de dirección para el puerto Https. Intenté verificar el proceso asociado con el puerto usando el siguiente comando en cmd:
netstat -aon | Findstr [puerto]
pero no muestra ningún proceso asociado con el puerto.
Intenté cerrar el proceso tomcat desde el administrador de tareas y también intenté ejecutar tomact shutdown.bat y luego comencé a tomar tomcat nuevamente, pero nada ayudó.
Si se reinicia el sistema donde se implementa la aplicación, el problema se resuelve pero no podemos reiniciar el sistema en ningún momento
Ayude, ¿cuál podría ser el problema y qué más se puede verificar?
A continuación se muestra el error en el registro de errores de tomcat:
03-Aug-2018 11:42:32.008 INFO [main] org.apache.coyote.AbstractProtocol.init
Initializing ProtocolHandler ["http-nio-443"]
03-Aug-2018 11:42:32.008 SEVERE [main]
org.apache.coyote.AbstractProtocol.init Failed to initialize end point
associated with ProtocolHandler ["http-nio-443"]
java.net.BindException: Address already in use: bind
at sun.nio.ch.Net.bind0(Native Method)
at sun.nio.ch.Net.bind(Unknown Source)
at sun.nio.ch.Net.bind(Unknown Source)
at sun.nio.ch.ServerSocketChannelImpl.bind(Unknown Source)
at sun.nio.ch.ServerSocketAdaptor.bind(Unknown Source)
at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:351)
at
org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:748)
at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:459)
at
org.apache.coyote.http11.AbstractHttp11JsseProtocol.init(AbstractHttp11Jss
eProtocol.java:120)
at org.apache.catalina.connector.Connector.initInternal(Connector.java:960)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
at org.apache.catalina.core.StandardService.initInternal
(StandardService.java:568)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
at org.apache.catalina.core.StandardServer.initInternal
(StandardServer.java:869)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
at org.apache.catalina.startup.Catalina.load(Catalina.java:580)
at org.apache.catalina.startup.Catalina.load(Catalina.java:603)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:310)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:484)
03-Aug-2018 11:42:32.008 SEVERE [main]
org.apache.catalina.core.StandardService.initInternal Failed to initialize
connector [Connector[HTTP/1.1-443]]
org.apache.catalina.LifecycleException: Failed to initialize component
[Connector[HTTP/1.1-443]]
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:106)
at org.apache.catalina.core.StandardService.initInternal
(StandardService.java:568)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
at org.apache.catalina.core.StandardServer.initInternal
(StandardServer.java:869)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
at org.apache.catalina.startup.Catalina.load(Catalina.java:580)
at org.apache.catalina.startup.Catalina.load(Catalina.java:603)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:310)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:484)
Caused by: org.apache.catalina.LifecycleException: Protocol handler
initialization failed
at org.apache.catalina.connector.Connector.initInternal(Connector.java:962)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
... 12 more
Caused by: java.net.BindException: Address already in use: bind
at sun.nio.ch.Net.bind0(Native Method)
at sun.nio.ch.Net.bind(Unknown Source)
at sun.nio.ch.Net.bind(Unknown Source)
at sun.nio.ch.ServerSocketChannelImpl.bind(Unknown Source)
at sun.nio.ch.ServerSocketAdaptor.bind(Unknown Source)
at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:351)
at
org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:748)
at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:459)
at org.apache.coyote.http11.AbstractHttp11JsseProtocol.init
(AbstractHttp11JsseProtocol.java:120)
at org.apache.catalina.connector.Connector.initInternal(Connector.java:960)
... 13 more03-Aug-2018 11:42:32.008 INFO [main]
org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-
nio-443"]
03-Aug-2018 11:42:32.008 SEVERE [main]
org.apache.coyote.AbstractProtocol.init
Failed to initialize end point associated with ProtocolHandler ["http-nio-
443"]
java.net.BindException: Address already in use: bind
at sun.nio.ch.Net.bind0(Native Method)
at sun.nio.ch.Net.bind(Unknown Source)
at sun.nio.ch.Net.bind(Unknown Source)
at sun.nio.ch.ServerSocketChannelImpl.bind(Unknown Source)
at sun.nio.ch.ServerSocketAdaptor.bind(Unknown Source)
at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:351)
at org.apache.tomcat.util.net.AbstractEndpoint.init
(AbstractEndpoint.java:748)
at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:459)
at org.apache.coyote.http11.AbstractHttp11JsseProtocol.init
(AbstractHttp11JsseProto col.java:120)
at org.apache.catalina.connector.Connector.initInternal(Connector.java:960)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
at org.apache.catalina.core.StandardService.initInternal
(StandardService.java:568)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
at org.apache.catalina.core.StandardServer.initInternal
(StandardServer.java:869)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
at org.apache.catalina.startup.Catalina.load(Catalina.java:580)
at org.apache.catalina.startup.Catalina.load(Catalina.java:603)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:310)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:484)
03-Aug-2018 11:42:32.008 SEVERE [main]
org.apache.catalina.core.StandardService.initInternal Failed to initialize
connector [Connector[HTTP/1.1-443]]
org.apache.catalina.LifecycleException: Failed to initialize component
[Connector[HTTP/1.1-443]]
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:106)
at org.apache.catalina.core.StandardService.initInternal
(StandardService.java:568)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
at org.apache.catalina.core.StandardServer.initInternal
(StandardServer.java:869)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
at org.apache.catalina.startup.Catalina.load(Catalina.java:580)
at org.apache.catalina.startup.Catalina.load(Catalina.java:603)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:310)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:484)
Caused by: org.apache.catalina.LifecycleException: Protocol handler
initialization failed
at org.apache.catalina.connector.Connector.initInternal(Connector.java:962)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
... 12 more
Caused by: java.net.BindException: Address already in use: bind
at sun.nio.ch.Net.bind0(Native Method)
at sun.nio.ch.Net.bind(Unknown Source)
at sun.nio.ch.Net.bind(Unknown Source)
at sun.nio.ch.ServerSocketChannelImpl.bind(Unknown Source)
at sun.nio.ch.ServerSocketAdaptor.bind(Unknown Source)
at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:351)
at org.apache.tomcat.util.net.AbstractEndpoint.init
(AbstractEndpoint.java:748)
at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:459)
at org.apache.coyote.http11.AbstractHttp11JsseProtocol.init
(AbstractHttp11JsseProtocol.java:120)
at org.apache.catalina.connector.Connector.initInternal(Connector.java:960)
... 13 more
Vea la actualización a continuación. Creemos que hemos encontrado la causa raíz y una solución
Tenemos el mismo problema: un servicio Tomcat que estuvo funcionando sin problemas durante casi un año no pudo unirse al puerto que utilizó después de que se detuvo y luego se reinició.
Por lo general, detenemos y reiniciamos nuestro servicio Tomcat regularmente todas las noches, y solía funcionar sin problemas. El problema se produjo por primera vez el 24 de julio, por lo que después de una gran cantidad de investigación que yo y nuestra TI hemos hecho, sospecho que algún tipo de cambio en nuestra infraestructura de TI que ocurrió poco antes del 24 de julio causa este problema.
Nuestro servidor es Windows Server 2012 R2, de 64 bits, pero nuestro entorno de TI está virtualizado y se ejecuta en vSphere Host Versión 6. ¿En qué servidor / infraestructura funciona su tomcat? ¿Es un sistema virtualizado o se ejecuta en un servidor físico?
En mi opinión, el problema se produjo con los últimos parches instalados para Windows (KB4338815 y / o KB4339093) o con algunas actualizaciones de Hypervisor. Pero nuestra TI todavía está investigando.
Por el momento, como solución alternativa, reiniciamos el servidor cuando apagamos el servicio y lo reiniciamos regularmente todas las noches. Pero debido a que el problema no es confiable ocurre en cada apagado / reinicio, reiniciamos el servidor solo si es realmente necesario. Para lograr esto, utilizamos un escucha que hemos implementado y configurado en el server.xml que escanea el stderr.log justo después de que se inicie el servicio tomcat. Si detecta que se produce una excepción de enlace, reinicia el servidor (el servicio tomcat se instala como automático). Si encuentra la causa de este problema, publíquelo aquí, como lo haré, si yo o nuestro departamento de TI lo encontraremos.
Actualización 7 de agosto: Creemos que hemos encontrado la causa raíz. Obviamente, el paquete acumulativo de calidad mensual de Windows para julio introdujo este problema. En nuestro caso (Windows Server 2012 R2, 64 bits), la actualización problemática fue KB4338815 (consulte https://support.microsoft.com/en-us/help/4338815/windows-81-update-kb4338815 ).
Si realiza una investigación rápida en Internet, el problema, que también afecta al servidor web Windows IIS y al servidor MS SQL, se describe principalmente como relacionado con KB4338818 (consulte https://support.microsoft.com/en-us/help/4338818/windows-7-update-kb4338818 ) pero este es el mismo tipo de actualización para Windows Server 2008 R2 y Windows 7.
Microsoft ya conoce el problema y lo describe en su documentación para KB4338815 y KB4338818 en la sección "Problemas conocidos en esta actualización" de los artículos mencionados. Microsoft afirma que el problema se resuelve en KB4338831 (para Windows Server 2012 R2, Windows 8.1) y KB4338821 (para Windows Server 2008 R2, Windows 7)
En nuestro caso, instalamos el hotfix KB4345424 (consulte https://support.microsoft.com/en-us/help/4345424/improvements-and-fixes-windows-8-1-and-server-2012-r2 ), también disponible de Microsoft, que soluciona este error y, hasta donde vemos, el problema ya no existe.