Edite "server.xml" no Tomcat sem reiniciar o servidor?

10

Editei o arquivo "server.xml" na confpasta do Tomcat 8 . Eu adicionei uma nova Hosttag para um novo site.

Devo reiniciar o servidor Tomcat?

Posso fazer o Tomcat analisar e aplicar a nova edição server.xml?

Basil Bourque
fonte
@dawud Obrigado pelo link, mas estamos falando <Host>, não <Context>.
Basil Bourque
2
Independentemente disso, a parte importante é que server.xmlé analisada uma vez na inicialização. Não pode ser recarregado sem uma reinicialização.
Dawud 30/05
@dawud Obrigado. Eu vejo essa menção agora. Fiz uma resposta para que eu possa fechar esta pergunta.
Basil Bourque

Respostas:

14

Eu começaria dizendo que a pergunta não foi feita corretamente, pois é possível editar o arquivo sem reiniciar o Tomcat, mas as alterações são ignoradas pelo processo em execução.

A verdadeira questão seria como aplicar alterações server.xmlsem reiniciar o Tomcat.

Reunindo informações do processo de inicialização e das páginas do carregador de classes na documentação on-line do Tomcat, é possível entender isso com mais detalhes.

Mais especificamente, está descrito em serverStartup.txt e no diagrama UML do processo de inicialização e as partes relevantes podem ser resumidas da seguinte forma:

Sequence 1. Start from Command Line
  ...
Sequence 2. Process command line argument (start, startd, stop, stopd)
Class: org.apache.catalina.startup.Bootstrap (assume command->start)
What it does:
a) Catalina.setAwait(true);
b) Catalina.load()
    b3) createStartDigester()
        Configures a digester for the main server.xml elements
    b4) Load the server.xml and parse it using the digester
        Parsing the server.xml using the digester is an automatic
        XML-object mapping tool, that will create the objects defined
        in server.xml
        Startup of the actual container has not started yet.
    b6) Calls initialize on all components, this makes each object
        register itself with the JMX agent.

Isso acontece após a criação do carregador de classe Bootstrap do mecanismo de servlet (Catalina).

Com essas informações, fica claro agora quando, no processo de inicialização, o server.xmlarquivo é analisado, mas na verdade não responde à pergunta de por que é necessário reiniciar o Tomcat para aplicar alterações nesse arquivo.

A resposta é que alguma parte dela pode ser modificado dinamicamente em tempo de execução usando JMX . Para que isso seja possível, é necessário registrar o MBean apropriado (etapa b6 acima) e também aceitar operações SET (alguns MBeans possuem apenas uma interface GET).

No seu caso específico, não há como criar e registrar um novo Host em tempo de execução porque não há previsão para isso, e é por isso que você precisa reiniciar o processo do Tomcat para que o carregador de classes do Bootstrap instanciar esse objeto e registrá-lo com Agente JMX.

Posteriormente, é possível modificar esse host a partir de um cliente JMX, como o jconsolefornecido com qualquer JDK.

Conecte-o jconsolea um Tomcat habilitado para JMX e navegue no MBean do Host para verificar todos os atributos disponíveis:

jconsole mostrando atributos do Host MBean

e verifique todas as operações disponíveis (uma delas mostrada abaixo como exemplo):

jconsole mostrando um exemplo de operação no Host MBean

dawud
fonte
1
+1 por me apresentar o JMX.
Raja Anbazhagan
7

Não. Reinicialização necessária.

A página de documento do Tomcat para <Context>menções:

… O arquivo principal conf / server.xml não pode ser recarregado sem reiniciar o Tomcat.

Basil Bourque
fonte
1
Esses upvotes devem ir para @dawud ... sem mais comentários. Resposta pobre para alguém que disse we’re talking about <Host>, not <Context>.-1 desculpe, é raro eu fazer isso, mas não tenho de ...
krisFR
@krisFR dawud estava livre para escrever uma resposta a qualquer momento, agora ou agora. Nem todo mundo joga esse jogo com votos positivos.
Basil Bourque
1
@krisFR, Basil Bourque Adicionei uma resposta mais detalhada para abordar isso de uma maneira mais geral. Espero que seja útil.
Dawud 31/05