Ci sono tutti i tipi di modi per farlo.
Uno, è possibile utilizzare un timer EJB per creare un processo run-once che verrà avviato immediatamente. Questa è una buona tecnica per generare processi in background. Un timer EJB è associato a un'implementazione Session Bean specifica. È possibile aggiungere un Timer EJB a ogni Session Bean che si desidera essere in grado di fare, oppure si può avere un singolo Session Bean che può quindi chiamare la logica dell'applicazione attraverso un meccanismo di invio.
Per me, passo un blob serializzabile di parametri insieme a un nome di classe che soddisfa un'interfaccia specifica a un Session Bean generico che esegue quindi la classe. In questo modo posso facilmente fare da sfondo a qualsiasi cosa.
Un avvertimento sul timer EJB è che i timer EJB sono persistenti. Una volta creato un Timer EJB, rimane nel contenitore fino a quando il suo lavoro non è terminato o cancellato. Il problema è che se si ha un lungo processo in esecuzione e il server non funziona, al riavvio il processo continuerà e riprenderà. Ricorda che può essere una buona cosa, ma solo se il tuo processo è pronto per essere riavviato. Ma se hai un processo semplice che esegue iterazione di "10.000 elementi", se il server scende sull'articolo 9999, quando viene ripristinato puoi facilmente vederlo semplicemente ricominciare dall'articolo 1. È tutto praticabile, solo un avvertimento da tenere presente di.
Un altro modo per fare uno sfondo è utilizzare una coda JMS. Metti un messaggio in coda e il gestore viene eseguito in modo asincrono dal resto dell'applicazione.
La parte intelligente qui e qualcosa che ho fatto anche sfruttando il lavoro con Timer Bean, è possibile controllare quanti "lavori" verranno eseguiti in base a quante istanze MDB si configurano il sistema.
Quindi, per lo specifico compito di eseguire un processo in più blocchi paralleli, prendo il compito, lo suddivido in "pezzi", quindi invio ogni pezzo nella Coda messaggi, dove vengono eseguiti dagli MDB. Se consento 10 istanze di MDB, posso avere 10 "parti" di qualsiasi attività in esecuzione simultaneamente.
In realtà funziona sorprendentemente bene. C'è un po 'di overhead che divide il processo e lo indirizza attraverso la coda JMS, ma questo è tutto fondamentalmente "tempo di avvio". Una volta che si ottiene, si ottiene un vantaggio reale.
Un altro vantaggio dell'utilizzo della coda messaggi è che è possibile eseguire i processi in esecuzione lunghi su una macchina separata oppure creare facilmente un cluster di macchine per gestire questi processi. Tuttavia, l'interfaccia è la stessa e il codice non conosce la differenza.
Ho scoperto che una volta retrocesso un processo di lunga durata in background, è possibile pagare il prezzo di un accesso meno immediato a tale processo. Cioè, non c'è motivo di monitorare direttamente le classi di esecuzione stesse, basta che pubblichino informazioni interessanti e statistiche sul database, o JMX, o qualsiasi cosa invece di avere qualcosa che possa monitorare direttamente l'oggetto perché condivide lo stesso spazio di memoria.
sono stato facilmente in grado di creare un quadro che lascia esecuzione dell'attività sia sul timer EJB o sulla coda dispersione MDB, i compiti sono gli stessi, e ho potuto monitorare i loro progressi, fermarli, ecc
È possibile combinare la tecnica scatter per creare diversi lavori EJB Timer. Uno dei vantaggi gratuiti di MDB è che agisce come un pool di thread che può limitare i lavori (in modo da non saturare improvvisamente il sistema con troppi processi in background). Ottieni questo "gratuitamente" semplicemente sfruttando le funzionalità di gestione EJB nel contenitore.
Infine, Java EE 6 ha un nuovo qualificatore "asincrono" (o qualcosa) per i metodi Session Bean. Non conosco i dettagli su come funziona, dato che devo ancora giocare con un nuovo contenitore Java EE 6. Ma immagino che probabilmente non vorrai cambiare contenitore solo per questa struttura.
Sembra che 'WorkManager' sia specifico di WebSphere, quindi inadatto in generale: http://stackoverflow.com/questions/9026516/replacing-webspheres-workmanager-in-jboss – Raedwald
Questo non si riferisce al commonj WorkManager, ma a una soluzione specifica IBM che lo precede. Come ho già detto, commonj non è specifico di IBM ed è disponibile nella maggior parte delle piattaforme. – Robin