Estou usando Java e quero manter um servlet em execução contínua em meu aplicativo, mas não estou sabendo como fazer isso. Meu servlet tem um método que fornece contagens diárias de usuários de um banco de dados, bem como a contagem total de usuários de todo o banco de dados. Portanto, quero manter o servlet em execução contínua para isso.
97
Respostas:
Seu problema é que você entendeu mal o propósito do servlet . Sua intenção é agir em solicitações HTTP, nada mais. Você quer apenas uma tarefa em segundo plano que é executada uma vez por dia.
EJB disponível? Usar
@Schedule
Se acontecer de seu ambiente suportar EJB (ou seja, um servidor Java EE real, como WildFly, JBoss, TomEE, Payara, GlassFish, etc), use em seu
@Schedule
lugar. aqui estão alguns exemplos:Sim, isso é realmente tudo. O contêiner irá retirá-lo e gerenciá-lo automaticamente.
EJB indisponível? Usar
ScheduledExecutorService
Se o seu ambiente não suportar EJB (ou seja, você não está usando um servidor Java EE real, mas um servletcontainer barebones como Tomcat, Jetty, etc), use
ScheduledExecutorService
. Isso pode ser iniciado por aServletContextListener
. Aqui está um exemplo inicial:Onde as classes de trabalho são assim:
Nunca pense em usar
java.util.Timer
/java.lang.Thread
em um ambiente baseado em Java EE / ServletPor último, mas não menos importante, nunca use diretamente
java.util.Timer
e / oujava.lang.Thread
em Java EE. Esta é a receita para problemas. Uma explicação elaborada pode ser encontrada nesta resposta relacionada ao JSF na mesma pergunta: Gerando threads em um bean gerenciado JSF para tarefas agendadas usando um cronômetro .fonte
ScheduledExecutorService
: Certifique-se de capturar todas as exceções em seu executor. Se uma exceção escapar do seurun
método, o executor interromperá a execução silenciosamente. Este é um recurso, não um bug. Leia o documento e estude com algumas pesquisas no Google.scheduler.shutdownNow()
não for invocado corretamente conforme o exemplo. Se isso não for invocado, o encadeamento de agendamento continuará em execução.Eu sugeriria o uso de uma biblioteca como o quartzo para executar a tarefa em intervalos regulares. O que o servlet realmente faz? Ele envia um relatório para você?
fonte
Implementar duas classes e chamar
startTask()
emmain
.fonte
Você pode usar o cron4j. http://www.sauronsoftware.it/projects/cron4j/manual.php
fonte
Em um sistema de produção que pode ter vários contêineres que não sejam jee em execução. Use um planejador corporativo como o planejador Quartz, que pode ser configurado para usar um banco de dados para maamgememt de tarefas.
fonte