Si ce dernier est le cas, serait-il préférable d'étendre la classe EventBus afin d'ajouter une telle fonctionnalité ou à mettre en œuvre toute la logique de bus d'événement dans la propre application?
Je suppose que, tout ce que vous avez besoin est d'ajouter un attribut handled
à l'événement et ajouter un testAndSet
à tous vos gestionnaires. Le faire manuellement est sûrement sujet aux erreurs, si vous en avez beaucoup.
Vous pouvez créer un wrapper pour votre événement, ce qui ne vous permettrait pas d'y accéder sans l'appeler. Quelque chose comme
@RequiredArgsConstructor
class WrappedEvent<E extends MyEvent> {
private final E event;
private boolean handled;
Optional<E> getAndMarkHandledUnlessHandled() {
if (handled) {
return Optional.empty();
} else {
handled = true;
return Optional.of(event);
}
}
}
ou le faire de manière plus fonctionnelle comme callAndMarkHandledUnlessHandled(Consumer<E> consumer)
. Pour l'envoi asynchrone, vous devez utiliser un AtomicBoolean
.
Cependant, en raison de l'effacement, cela ne fonctionnera pas avec WrappedEvent<A>
et WrappedEvent<B>
car le EventBus
n'a pas d'information générique disponible. Vous pourriez sous-classer le wrapper comme WrappedA extends WrappedEvent<A> {}
et travailler avec. C'est sacrément moche.
L'extension significative du EventBus
n'est guère possible, si vous ne voulez pas vous faufiler dans son emballage. Le moyen le plus simple serait probablement de forcer l'ensemble du paquet et d'ajouter une pause après this line.
Merci beaucoup - J'ai lu et testé ça mais mon test n'était pas valide: je n'ai pas enregistré le second auditeur ;-) – Hannes