Recentemente uma aplicação estava super travada no Servidor, e olhando o "Server Status" do tomcat encontramos dezenas e dezenas de requisições se acumulando sem nenhuma receber resposta. Usar o "Stop" para depois dar o "Start" não representou avanço. Mas conseguimos resolver em pouco tempo sem precisar restartar o tomcat inteiro (o que seria extremamente indesejado por causa das outras aplicações rodando no mesmo tomcat para nossos clientes em horário de expediente).
O que aconteceu, do início ao fim:
-
No tomcat entrei no manager e usei o "Stop", o que parou a aplicação (e vamos supor que fez algo que pode ter sido seguro com relação à algumas transações pendentes) mas não foi suficiente para desacumular as requisições, que continuaram lá travadas esperando e esperando.
-
No tomcat utilizar o "Start" neste cenário se provou indiferente, pois cada clique no botão apenas gerava uma requisição a mais do próprio tomcat tentando dar start na aplicação e não conseguindo, acumulando mais requisições em espera.
-
Com a aplicação parada no tomcat, matamos (na máquina de banco de dados) todos os processos pendentes de acesso ao banco da aplicação em questão. Isso resolveu para limpar parte das requisições pendentes visíveis no Server Status do tomcat. Entretanto as requisições Stop e Start do próprio tomcat permaneceram travadas (sem nada acontecendo no catalina.out do tomcat nem no log da aplicação).
-
Diretamente na pasta webapps do tomcat foi removido o war e a pasta descompactada da aplicação. Imediamente o tomcat já não listava mais a aplicação, após este undeploy forçado. Mas apenas após uns 30 segundos que as requisições Start e Stop sumiram do Server Status do tomcat.
-
Uma vez sem pendências de requisições, recuperamos o war da aplicação, de forma que o tomcat automaticamente detectou o "novo war", fez o deploy e rodou a aplicação com sucesso. Sem precisar matar o tomcat!
Fica a experiência \o/