Comment fonctionne un événement Java, en particulier le javax.entreprise.événement.le feu() se comporte?


J'ai la situation suivante (en cours d'exécution sur JBoss AS6 et AS7):

  • Un EJB Singleton avec une méthode planifiée.
  • Un événement injecté de type SomethingChangedEvent

Considérons les exemples suivants:

@Singleton
public final class Scheduler {
    @Inject
    private Event<SomethingChangedEvent> event;

    @Schedule
    private void scheduleSomething() {
        event.fire(new SomethingChangedEvent());
    }
}

Je m'attendrais à ce que cet événement soit ajouté à une sorte de file d'attente sur le serveur et distribué par celui-ci. Toutes les méthodes qui observent ce type d'événement en utilisant @Observers seront notifiées. La méthode event.fire() retournera immédiatement.

Cependant, je fais face à ce qui suit problème: Parfois, la méthode event.fire() prend deux ou trois minutes pour revenir, causant des ravages dans mon emploi du temps car elle est supposée être invoquée une fois toutes les dix secondes.

Les questions sont donc: Comment est-ce possible? Qu'advient-il des événements qui sont déclenchés, mais personne ne les observe? Est-il une file d'attente qui peuvent déborder?

Cordialement, Sven

Author: Sven Plath, 2013-01-24

1 answers

Le traitement des événements CDI se produit de manière synchrone. Il y a en fait une proposition pour inclure un modèle de traitement asynchrone dans la spécification, mais elle est toujours en cours de vote. En attendant, il existe deux façons de "forcer" le traitement asynchrone:

  1. Utilisez JMS - oui, c'est un kludge car il revient aux anciennes technologies Java EE. Mais ça marche
  2. Utilisez une méthode @Asynchrone sur les méthodes producer et observer, pour diviser ces invocations de méthodes en séparez les threads gérés par conteneur.

Application de la deuxième méthode à votre exemple de code:

@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