2010-11-08 45 views
14

Estoy construyendo una aplicación de estadísticas para un juego en línea, construida usando la API de servlet en Java (para implementar en Tomcat). Es bastante fácil dejar que el juego envíe un mensaje al servidor de estadísticas cada vez que un usuario inicia sesión, porque las solicitudes de manejo son para lo que Servlets/Tomcat son.Tarea programada en una aplicación web?

También necesito iniciar periódicamente solicitudes en el servidor de estadísticas, por ejemplo para recuperar la cantidad de usuarios en línea del servidor del juego o la cantidad de fanáticos de nuestra página de Facebook.

Sería fácil simplemente iniciar un subproceso en el servlet principal de la aplicación y dejar que realice la recuperación de datos de vez en cuando, pero se siente un poco extraño porque el resto de los subprocesos son creados por Tomcat.

  1. Lo está haciendo así ok?
  2. Si no, ¿cuál es la forma recomendada de hacerlo?
  3. ¿Es correcto usar servlets para algo como esto? ¿Cuál es la alternativa?

Nota después de las primeras respuestas: No estoy buscando una solución al problema del tiempo o concurrencia, porque puedo manejar ambos fácilmente. Solo necesito saber cómo iniciar correctamente un proceso proactivo en un contenedor de servlets.

Respuesta

13

El cuarzo es su mejor opción, y el más altamente configurable. Tiene una interfaz basada en CRON o una forma más dinámica de generar trabajos que son relativos desde un evento específico, si su caso de uso lo llama, Quartz puede hacerlo. Tiene la capacidad de conservar trabajos en la base de datos para que puedan sobrevivir a reinicios.

http://www.quartz-scheduler.org/

realizar configuraciones en web.xml como este para auto-iniciarlo:

<servlet> 
    <servlet-name>QuartzInitializer</servlet-name> 
    <display-name>Quartz Initializer Servlet</display-name> 
    <servlet-class>org.quartz.ee.servlet.QuartzInitializerServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 

    <init-param> 
     <param-name>shutdown-on-unload</param-name> 
     <param-value>true</param-value> 
    </init-param> 

    <init-param> 
     <param-name>start-scheduler-on-load</param-name> 
     <param-value>true</param-value> 
    </init-param> 

    </servlet> 
+0

Gracias, pero los problemas específicos de tiempo no son lo que tengo que tratar. A juzgar por un tutorial sobre Quartz + Tomcat, todavía necesita iniciar y detener Quartz de una manera equivalente a cómo comenzaría mi propio hilo. –

+0

No estoy seguro de qué tutorial estás mirando, pero normalmente querrías iniciarlo automáticamente con la configuración y no depender de las dependencias de tiempo de ejecución para esto, es mucho más limpio. Quizás esto es lo que estás buscando. – vaskin

9

usted debe considerar:

No se moleste reinventar la rueda, cuarzo y otros productos ya manejar hilos/tiempos de espera/problemas de concurrencia para usted!

+5

2 años después, la versión más moderna de TimerTask es [ScheduledExecutorService] (http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ScheduledExecutorService.html) – Danger

+0

thumbs up para mencionar Más Que una forma de hacerlo – jsh

Cuestiones relacionadas