Ricerca del framework / libreria di esecuzione dei lavori Java asincroni generici
-
03-07-2019 - |
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:
-
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.) -
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.
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 :)