Pregunta

En el podcast #15, Jeff mencionó que tuiteó sobre cómo ejecutar un evento regular en segundo plano como si fuera una función normal; desafortunadamente, parece que no puedo encontrarlo a través de Twitter.Ahora necesito hacer algo similar y voy a lanzar la pregunta a las masas.

Mi plan actual es que cuando el primer usuario (probablemente yo) ingresa al sitio, inicia un hilo en segundo plano que espera hasta el tiempo asignado (cada hora en punto) y luego inicia el evento bloqueando a los demás (soy un programador de Windows de profesión, así que Pienso en términos de eventos y WaitOnMultipleObjects) hasta que se complete.

¿Cómo lo hizo Jeff en Asp.Net? ¿Su método es aplicable al mundo de las aplicaciones web Java?

¿Fue útil?

Solución

Creo que no siempre vale la pena desarrollar una solución personalizada para ejecutar tareas en segundo plano, por lo que recomiendo utilizar el Programador de cuarzo en Java.

En su situación (necesita ejecutar tareas en segundo plano en una aplicación web), puede usar el ServletContextListener incluido en la distribución para inicialice el motor al iniciar su contenedor web.

Después de eso, tiene varias posibilidades para iniciar (activar) sus tareas (trabajos) en segundo plano, p.puedes usar calendarios o expresiones similares a cron.En su situación lo más probable es que deba conformarse con Disparador simple que le permite ejecutar trabajos en intervalos fijos y regulares.

Los trabajos en sí también se pueden describir fácilmente en Quartz; sin embargo, no ha proporcionado ningún detalle sobre lo que necesita ejecutar, por lo que no puedo ofrecer una sugerencia en esa área.

Otros consejos

Como se mencionó, Quartz es una solución estándar.Si no le importa la agrupación en clústeres o la persistencia de las tareas en segundo plano durante los reinicios, puede utilizar la compatibilidad integrada con ThreadPool (en Java 5,6).Si usas un Servicio de ejecución programado puede colocar Runnables en el grupo de subprocesos en segundo plano que esperan una cantidad de tiempo específica antes de ejecutarse.

Si le importa la agrupación en clústeres y/o la persistencia, puede usar colas JMS para la ejecución asincrónica, aunque aún necesitará alguna forma de retrasar las tareas en segundo plano (puede usar Quartz o ScheduledExecutorService para hacer esto).

El mecanismo de Jeff era crear algún tipo de objeto almacenado en caché que ASP.Net recrearía automáticamente en algún tipo de intervalo. Parecía ser una solución específica de ASP.Net, por lo que probablemente no le ayudará mucho a usted (ni a mí) en el mundo Java.

Ver https://stackoverflow.fogbugz.com/default.asp?W13117

Atwood:Bueno, originalmente lo pregunté en Twitter porque solo quería algo liviano.Realmente no quería escribir un servicio de Windows.Sentí que eso estaba fuera del código de la banda.Además, el código que realmente hace el trabajo es una página web, porque para mí esa es una unidad lógica de trabajo en un sitio web que es una página web.Entonces, realmente es como si volviéramos a llamar al sitio web, es como otra solicitud en el sitio web, así que lo vi como algo que debería permanecer en línea, y el pequeño enfoque que se nos ocurrió me lo recomendaron en Twitter. Básicamente, era agregar algo al caché de la aplicación con una caducidad fija, luego tienes una devolución de llamada, de modo que cuando caduca llama a una determinada función que hace el trabajo y luego lo vuelves a agregar al caché con la misma caducidad.Entonces, es un poco, tal vez "gueto" sea la palabra correcta.

Mi enfoque siempre ha sido tener que el sistema operativo (es decir,Cron o el programador de tareas de Windows) cargan una URL específica en algún intervalo y luego configuran una página en esa URL para verificar su cola y realizar las tareas necesarias, pero me interesaría saber si hay una manera mejor.

Según la transcripción, parece que FogBugz también utiliza el servicio de Windows para cargar una URL.

Spolsky:Entonces tenemos esta página especial llamada heartbeat.asp.Y esa página, cada vez que la accedes, cualquiera puede acceder a ella en cualquier momento:no duele.Pero cuando se ejecuta esa página, verifica una cola de tareas en espera para ver si hay algo que deba hacerse.Y si hay algo que deba hacerse, hace una cosa y luego busca en esa cola nuevamente y si hay algo más que hacer, devuelve un signo más, y toda la página web que devuelve es solo un carácter con un signo más. en eso.Y si no hay nada más que hacer, la cola ahora está vacía y devuelve un signo menos.Entonces, cualquiera puede llamar a esto y presionarlo tantas veces, puede cargar heartbeat.asp en su navegador web y presionar Ctrl-R Ctrl-R Ctrl-R Ctrl-R hasta que comience a obtener desventajas en lugar de ventajas.Y cuando haya hecho eso, FogBugz habrá completado todo el trabajo de mantenimiento que necesita realizar.Esa es la primera parte, y la segunda parte es un servicio de Windows muy, muy simple que se ejecuta, y su trabajo completo es llamar a heartbeat.asp y si obtiene un plus, volver a llamarlo pronto, y si obtiene un negativo, llamarlo de nuevo, pero no por un tiempo.Básicamente, existe este servicio de Windows que siempre está ejecutándose, que tiene una tarea muy, muy, muy simple de simplemente presionar una URL y ver si obtiene un plus o un menos y luego programar cuándo se ejecuta nuevamente en función de si obtuvo un más o un menos.Y obviamente puede hacer cualquier tipo de variación que desee en este tema, como por ejemplo, uh, en realidad podría, en lugar de devolver solo una ventaja o menos, podría decir "Está bien llámame en 60 segundos" o "llamarme bien lejos tengo más trabajo por hacer ". Y así es como funciona ...entonces ese servicio de mantenimiento simplemente se ejecuta, ya sabes, es como media página de código que ejecuta ese servicio de mantenimiento, y nunca tiene que cambiar, y no tiene ninguna lógica allí, simplemente contiene el cosquilleo que hace que estas páginas web sean llamadas con una cierta frecuencia garantizada.Y dentro de esa página web en heartbeat.asp hay un código que mantiene una cola de tareas que deben realizarse y analiza cuánto tiempo ha transcurrido y realiza, ya sabes, mantenimiento nocturno y cada siete días elimina todos los mensajes más antiguos que han sido marcados como spam y todo tipo de tareas en segundo plano de mantenimiento.Y así es como se hace eso.

Usamos jtcron para nuestras tareas en segundo plano programadas.Funciona bien y si comprende cron, debería tener sentido para usted.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top