Como implantar um aplicativo Tomcat com Manager URL API ao usar XML de contexto personalizado

Como implantar um aplicativo Tomcat com Manager URL API ao usar XML de contexto personalizado

O contexto do meu aplicativo é definido como um arquivo XML localizado em 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/myAppcontém o arquivo WAR myAppWarFile.war e várias propriedades externalizadas que são lidas pelo Spring.

O Tomcat está configurado com o autoDeploy desativado. Quando eu inicio o Tomcat, ele cria my/path/to/Tomcat/conf/webapps/my-app/e o arquivo WAR é descompactado neste local conforme esperado, e o aplicativo, é claro, pode ser executado conforme esperado.

Quando desejo implantar uma nova versão sem reiniciar o Tomcat, executo o comando undeploy da seguinte maneira:

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

... e isso funciona. Mas quando instruo o Tomcat a implantar com a seguinte instrução curl, recebo uma falha.

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

Adicionar o caminho não ajuda muito, ainda recebo uma falha.

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

A pior parte é que seguir catalina.out não produz nenhum insight. E além disso, o Tomcat exclui o arquivo XML de contexto do aplicativo my/path/to/Tomcat/conf/Catalina/localhost/my-app.xml!

Naturalmente revisei a documentação do Tomcat (https://tomcat.apache.org/tomcat-8.0-doc/manager-howto.html#Deploy_using_a_Context_configuration_%22.xml%22_file) e pesquisei no Google o dia todo para descobrir isso, mas não encontrei nada que pudesse me ajudar com essa configuração específica.

Parece que a escolha é:

  1. Tomcat com autoDeploy ativado (não recomendado para produção); nesse caso, simplesmente descartar o novo WAR /my/path/to/myApp/fará com que o Tomcat implemente o aplicativo a quente.
  2. Tomcat com autoDeploy desativado, mas a reimplantação requer a reinicialização do Tomcat porque a API de implantação não parece estar funcionando conforme anunciado.

Alguém fez isso funcionar com essa configuração?

EDITAR:

Aumentei o registro em Catalina. Quando executo o primeiro comando de implantação sem o caminho, recebo este conjunto de entradas de log:

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

Responder1

O problema é comum. Com arquivos war binários portáteis, a configuração do contexto (ambiente) está no contexto onde deveria estar - não no arquivo war. Na reimplantação, por exemplo, ao aplicar um patch de software, o contêiner (Tomcat) deve ser reimplantado sem excluir o contexto.

Esta questão está sendo abordada emReimplantar da guerra sem excluir o contexto. Aparentemente, a suposição é que isso já é possível com a interface de texto, portanto, um caso em que isso não seja possível pode ser considerado um bug.

A solução sugerida é observar esse problema do Tomcat até que seja resolvido, pois esse problema de falha no servidor se torna uma duplicata dele.

informação relacionada