Cómo implementar una aplicación Tomcat con Manager URL API cuando se utiliza XML de contexto personalizado

Cómo implementar una aplicación Tomcat con Manager URL API cuando se utiliza XML de contexto personalizado

El contexto de mi aplicación se define como un archivo XML ubicado en my/path/to/Tomcat/conf/Catalina/localhost/my-app.xml.

<Context docBase='/my/path/to/myApp/myAppWarFile.war'>
   <Environment name='my_config_dir' value='/my/path/to/myApp' type='java.lang.String'/>
</Context>

/my/path/to/myAppcontiene el archivo WAR myAppWarFile.war y una serie de propiedades externalizadas que Spring lee.

Tomcat está configurado con autoDeploy desactivado. Cuando inicio Tomcat, se crea my/path/to/Tomcat/conf/webapps/my-app/y el archivo WAR se descomprime en esta ubicación como se esperaba y, por supuesto, la aplicación puede ejecutarse como se esperaba.

Cuando quiero implementar una nueva versión sin reiniciar Tomcat, ejecuto el comando undeploy de la siguiente manera:

curl http://localhost:8080/manager/text/undeploy?path=/my-app --user my-username:my-password

... y eso funciona. Pero cuando le indico a Tomcat que implemente con la siguiente declaración curl, obtengo un error.

curl http://localhost:8080/manager/text/deploy?config=file:/my/path/to/Tomcat/conf/Catalina/localhost/my-app.xml --user my-username:my-password
# Tomcat response
FAIL - Invalid context path null was specified

Agregar la ruta no ayuda mucho, todavía recibo un error.

curl http://localhost:8080/manager/text/deploy?config=file:/my/path/to/Tomcat/conf/Catalina/localhost/my-app.xml\&path=/my-app --user my-username:my-password

# Tomcat response
FAIL - Failed to deploy application at context path /my-app

La peor parte es que seguir a catalina.out no proporciona ninguna información. ¡Y además de eso, Tomcat elimina el archivo XML del contexto de la aplicación my/path/to/Tomcat/conf/Catalina/localhost/my-app.xml!

Naturalmente he revisado la documentación de Tomcat (https://tomcat.apache.org/tomcat-8.0-doc/manager-howto.html#Deploy_using_a_Context_configuration_%22.xml%22_file) y he buscado en Google todo el día para resolver esto, pero no encontré nada que pueda ayudarme con esta configuración en particular.

Parece que la elección es:

  1. Tomcat con autoDeploy activado (no recomendado para producción), en cuyo caso simplemente soltar el nuevo WAR /my/path/to/myApp/hará que Tomcat implemente en caliente la aplicación.
  2. Tomcat con la implementación automática desactivada, pero la reimplementación requiere reiniciar Tomcat porque la API de implementación no parece funcionar como se anuncia.

¿Alguien ha hecho que esto funcione con esta configuración?

EDITAR:

Subí el registro en Catalina. Cuando ejecuto el primer comando de implementación sin la ruta, obtengo este conjunto de entradas de registro:

FINE: Start processing with input [config=file:/my/apth/to/tomcat/conf/Catalina/localhost/my-app.xml]
Oct 13, 2015 10:04:53 AM org.apache.coyote.AbstractProtocol$AbstractConnectionHandler process
FINE: Socket: [org.apache.tomcat.util.net.SocketWrapper@189651c1:Socket[addr=/0:0:0:0:0:0:0:1,port=45415,localport=8080]], Status in: [OPEN_READ], State out: [OPEN]
Oct 13, 2015 10:04:53 AM org.apache.coyote.http11.AbstractHttp11Processor process
FINE: Error parsing HTTP request header
java.io.EOFException: Unexpected EOF read on the socket
    at org.apache.coyote.http11.Http11Processor.setRequestLineReadTimeout(Http11Processor.java:168)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:982)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:744)

Oct 13, 2015 10:04:53 AM org.apache.coyote.AbstractProtocol$AbstractConnectionHandler process
FINE: Socket: [org.apache.tomcat.util.net.SocketWrapper@189651c1:Socket[addr=/0:0:0:0:0:0:0:1,port=45415,localport=8080]], Status in: [OPEN_READ], State out: [CLOSED]
Oct 13, 2015 10:04:53 AM org.apache.tomcat.util.threads.LimitLatch countDown
FINE: Counting down[http-bio-8080-exec-16] latch=1

Respuesta1

El problema es común. Con los archivos war binarios portátiles, la configuración del contexto (entorno) está en el contexto donde debería estar, no en el archivo war. Al volver a implementarse, por ejemplo, al aplicar un parche de software, el contenedor (Tomcat) debería volver a implementarse sin eliminar el contexto.

Esta cuestión se está abordando enVolver a desplegarse desde la guerra sin borrar el contexto. Aparentemente se supone que esto ya es posible con la interfaz de texto, por lo que un caso en el que esto no sea posible podría considerarse un error.

La solución sugerida es observar este problema de Tomcat hasta que se resuelva, porque este problema de error del servidor se convierte en un duplicado del mismo.

información relacionada