Domanda

Sto cercando un generico framework di esecuzione dei lavori Java asincrono in grado di gestire Callable so Runnable . Sarebbe simile a java.util.concurrent.ExecutorService , (e possibilmente avvolgere ExecutorService ), ma avrebbe anche le seguenti caratteristiche:

  1. La capacità di conservare i lavori su un database nel caso in cui l'applicazione si interrompa durante la manutenzione di un lavoro e sia in grado di riavviare i lavori non finiti. (Capisco che il mio lavoro potrebbe dover implementare serializzabile che è OK.)

  2. Lavora con gli UUID per consentire al client di ottenere token di lavoro e informarsi sullo stato del lavoro. (Sotto questo cofanetto queste informazioni verrebbero mantenute anche in un database.)

Ho iniziato a lavorarci da solo costruendo attorno a ExecutorService , ma preferirei una soluzione pronta all'uso, se disponibile.

Qualcosa che potrebbe funzionare all'interno del Spring Framework sarebbe l'ideale.

È stato utile?

Soluzione

Puoi utilizzare Quartz e creare un < Job che delega a un eseguibile o Callable . L'interfaccia Job di Quartz aggiunge la possibilità di mantenere un certo stato tra le chiamate di un'attività. Se lo si desidera, Quartz può archiviare i lavori e il loro stato in modo duraturo in un database relazionale ed eseguirli su un cluster scalabile di host.

Altri suggerimenti

Potresti voler guardare Quartz .

  

Quartz è un sistema di pianificazione dei lavori open source completo che può essere integrato o utilizzato insieme a qualsiasi applicazione J2EE o J2SE, dalla più piccola applicazione autonoma al più grande sistema di e-commerce. Quartz può essere utilizzato per creare programmi semplici o complessi per l'esecuzione di decine, centinaia o addirittura decine di migliaia di lavori; lavori le cui attività sono definite come componenti Java standard o EJB. Quartz Scheduler include molte funzionalità di classe enterprise, come le transazioni JTA e il clustering.

Dai un'occhiata a http://www.opensymphony.com/quartz/wikidocs /Features.html e vedi se ha già qualcosa per te.

Da quella pagina:

  

Con l'uso del JDBCJobStore incluso, tutti i processi e i trigger sono configurati come "non volatili" sono archiviati in un database relazionale tramite JDBC

Un'altra direzione potrebbe essere qualcosa come usare Terracotta , che ha la capacità di raggruppare l'heap nella tua JVM e persistere per disponibilità. Terracotta supporta l'integrazione con Quartz se ciò è utile dal punto di vista della pianificazione . Inoltre, esiste un master-worker e messaggi modulo di integrazione anche essere utile. La terracotta è open source.

Per dare seguito al punto di Alex, una soluzione di Terracotta non persiste i tuoi lavori nel Database, sarebbe persistente nell'archivio di memoria distribuita di Terracotta.

Poiché Terracotta persiste l'archivio di memoria su disco, questa è una versione più efficiente di inserire quei lavori nel database.

Allo stesso tempo, ti dà un puro modello di programmazione POJO, quindi non devi nemmeno avere a che fare con DB txns, ORM e simili - a meno che il tuo particolare carico di lavoro non parli con il DB (nel qual caso Terracotta non ti aiuta né ti fa male qui, aiuta solo a distribuire il lavoro).

Il modello MasterWorker ti aiuterà a distribuire il lavoro sulla griglia e puoi iniziare facilmente usando un DistributedExecutorService, l'invio del lavoro è simile al seguente:

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

Ecco il link alla Guida di avvio rapido nel master-worker implementazione sulla fucina in terracotta .

Inoltre, Terracotta non richiede l'implementazione di Serializable, anche se è possibile se si desidera :)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top