Estoy usando Java y quiero mantener un servlet ejecutándose continuamente en mi aplicación, pero no entiendo cómo hacerlo. Mi servlet tiene un método que da recuentos diarios de usuarios de una base de datos, así como el recuento total de usuarios de toda la base de datos. Así que quiero mantener el servlet funcionando continuamente para eso.
97
Respuestas:
Su problema es que no entiende el propósito del servlet . Tiene la intención de actuar sobre solicitudes HTTP, nada más. Solo desea una tarea en segundo plano que se ejecute una vez al día.
¿EJB disponible? Utilizar
@Schedule
Si su entorno admite EJB (es decir, un servidor Java EE real como WildFly, JBoss, TomEE, Payara, GlassFish, etc.), utilice
@Schedule
en su lugar. Aquí hay unos ejemplos:Sí, eso es todo. El contenedor lo recogerá y gestionará automáticamente.
¿EJB no está disponible? Utilizar
ScheduledExecutorService
Si su entorno no es compatible con EJB (es decir, no está utilizando un servidor Java EE real, sino un contenedor de servlets básico como Tomcat, Jetty, etc.), utilice
ScheduledExecutorService
. Esto puede ser iniciado por aServletContextListener
. Aquí hay un ejemplo de inicio:Donde las clases de trabajo se ven así:
Nunca piense en usar
java.util.Timer
/java.lang.Thread
en un entorno basado en Java EE / ServletPor último, pero no menos importante, nunca use directamente
java.util.Timer
y / ojava.lang.Thread
en Java EE. Esta es la receta para los problemas. Se puede encontrar una explicación detallada en esta respuesta relacionada con JSF sobre la misma pregunta: Generación de subprocesos en un bean administrado por JSF para tareas programadas usando un temporizador .fuente
ScheduledExecutorService
: asegúrese de capturar todas las excepciones en su ejecutor. Si una excepción se escapa de surun
método, el ejecutor deja de ejecutar silenciosamente. Esto es una característica, no un error. Lea el documento y estudie buscando en Google.scheduler.shutdownNow()
no se invoca correctamente como en el ejemplo. Si no se invoca, el hilo de programación seguirá ejecutándose.Sugeriría usar una biblioteca como Quartz para ejecutar la tarea a intervalos regulares. ¿Qué hace realmente el servlet? ¿Te envía un informe?
fuente
Implementar dos clases y llamar
startTask()
enmain
.fuente
Puede utilizar cron4j. http://www.sauronsoftware.it/projects/cron4j/manual.php
fuente
En un sistema de producción que puede tener varios contenedores que no son jee en funcionamiento. Use un programador no empresarial como el programador Quartz, que se puede configurar para usar una base de datos para la tarea maamgememt.
fuente