Pregunta

Estoy buscando un marco de ejecución de trabajo Java asíncrono genérico que pueda manejar Callable o Runnable s. Sería similar a java.util.concurrent.ExecutorService , (y posiblemente envolver ExecutorService ), pero también tendría las siguientes características:

  1. La capacidad de persistir trabajos en una base de datos en caso de que la aplicación se caiga mientras se está revisando un trabajo y poder reiniciar los trabajos no finalizados. (Entiendo que mi trabajo puede tener que implementar Serializable que está bien).

  2. Trabaja con UUID para permitir que el cliente obtenga tokens de trabajo y pregunte sobre el estado del trabajo. (Bajo el capó, esta información también se conservará en una base de datos).

Empecé a trabajar en esto yo mismo construyendo alrededor de ExecutorService , pero preferiría una solución de código abierto lista para usar, si la hubiera.

Algo que podría funcionar dentro de Spring Framework sería ideal.

¿Fue útil?

Solución

Puede utilizar Quartz y crear un Trabajo que delega a un Ejecutable o Callable . La interfaz Job de Quartz agrega la capacidad de mantener cierto estado entre las invocaciones de una tarea. Si lo desea, Quartz puede almacenar trabajos y su estado de forma duradera en una base de datos relacional, y ejecutarlos en un clúster escalable de hosts.

Otros consejos

Es posible que desee consultar Quartz .

  

Quartz es un sistema de programación de trabajos de código abierto con todas las funciones que se puede integrar o utilizar prácticamente en cualquier aplicación J2EE o J2SE, desde la aplicación independiente más pequeña hasta el sistema de comercio electrónico más grande. El cuarzo se puede utilizar para crear programaciones simples o complejas para ejecutar decenas, cientos o incluso decenas de miles de trabajos; trabajos cuyas tareas se definen como componentes Java estándar o EJB. Quartz Scheduler incluye muchas características de clase empresarial, como transacciones JTA y agrupación en clústeres.

Consulte http://www.opensymphony.com/quartz/wikidocs /Features.html y vea si ya tiene algo para usted.

Desde esa página:

  

Con el uso del JDBCJobStore incluido, todos los Trabajos y Desencadenadores configurados como " no volátil " se almacenan en una base de datos relacional a través de JDBC

Otra dirección podría ser algo como usar Terracotta , que tiene la capacidad de agrupar montones en tu JVM y conservarlo disponibilidad. Terracotta admite la integración con Quartz si es útil desde el punto de vista de la programación . Además, hay un master-worker y un mensaje módulo de integración que podría ser útil también Terracota es de código abierto.

Para dar seguimiento al punto de Alex, una solución de Terracota no conservaría sus trabajos en la Base de datos, serían persistentes en el almacén de memoria distribuida de Terracota.

Dado que Terracotta persiste en el almacenamiento de la memoria en el disco, esta es una versión más eficiente de poner esos trabajos en la base de datos.

Al mismo tiempo, le brinda un modelo de programación POJO puro, por lo que ni siquiera tiene que lidiar con DB txns, ORM y similares, a menos que su carga de trabajo en particular llegue a hablar con la DB (en cuyo caso Terracotta no te ayuda ni te hace daño aquí, solo ayuda a distribuir el trabajo).

El patrón MasterWorker lo ayudará a distribuir el trabajo en la cuadrícula, y puede comenzar a utilizar un DistributedExecutorService muy fácilmente, presentando el trabajo de esta manera:

CompletionService executor = new DistributedCompletionService(new DistributedExecutorService("myTopologyName"));
executor.submit(new MyRunnable(), null);
...
Future f = executor.take();

Aquí está el enlace a guía de inicio rápido en el maestro-trabajador implementación en Terracotta Forge .

Lo que es más: Terracotta no requiere que implementes Serializable, aunque puedes si quieres :)

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