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

Author: Sven Plath, 2013-01-24

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:

  1. Usa JMS-sì, questo è un kludge perché sta tornando alle vecchie tecnologie Java EE. Ma funziona
  2. 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());
    }
}
 6
Author: Perception, 2013-01-25 21:08:58