Come funziona un evento Java, in particolare il javax.impresa.evento.fuoco () comportarsi?
Ho la seguente situazione (in esecuzione su JBoss AS6 e AS7):
- Un EJB Singleton con un metodo pianificato.
- Un evento iniettato di tipo
SomethingChangedEvent
Considera i seguenti esempi:
@Singleton
public final class Scheduler {
@Inject
private Event<SomethingChangedEvent> event;
@Schedule
private void scheduleSomething() {
event.fire(new SomethingChangedEvent());
}
}
Mi aspetto che questo evento venga aggiunto a una sorta di coda sul server e distribuito da esso. Tutti i metodi che osservano questo tipo di evento utilizzando @Observers
verranno notificati. Il metodo event.fire()
tornerà immediatamente.
Tuttavia, affronto quanto segue problema: a volte, il metodo event.fire()
richiede due o tre minuti per tornare, causando il caos nel mio programma poiché si presume che venga invocato una volta ogni dieci secondi.
Quindi le domande sono: Come è possibile? Cosa succede agli eventi che vengono licenziati, ma nessuno li osserva? C'è una coda che può traboccare?
Saluti, Sven
1 answers
L'elaborazione degli eventi CDI avviene in modo sincrono. Esiste in realtà una proposta per includere un modello di elaborazione asincrono nelle specifiche, ma è ancora in fase di votazione. Nel frattempo ci sono due modi per "forzare" l'elaborazione asincrona:
- Usa JMS-sì, questo è un kludge perché sta tornando alle vecchie tecnologie Java EE. Ma funziona
- Utilizzare un metodo@asincrono su entrambi i metodi produttore e osservatore, per dividere le invocazioni del metodo in separare i thread gestiti dal contenitore.
Applicazione del secondo metodo all'esempio di codice:
@Singleton
public final class Scheduler {
@Inject
private Event<SomethingChangedEvent> event;
@Asynchronous
private void scheduleSomething() {
event.fire(new SomethingChangedEvent());
}
}