Zwei Konzepte sind für mich zentral: Dependency Injection und Events. Nach dem jetzt DI durch CDI standardisiert ist, steht das für einen Event Bus noch aus. (CDI-kann man aber so interpretieren.) Über eine Lösung habe ich schon geschrieben: http://www.tutego.de/blog/javainsel/2009/03/einfuhrung-in-den-eventbus/. Ein Event Bus sollte natürlich mit einem DI-Container harmonieren. Nutzer von Google Guice können das mit Guts (englisch für Gedärme aber auch Mut) tun: http://kenai.com/projects/guts/pages/Home. Die Doku http://guts.kenai.com/guts-events/apidocs/ zeigt wie es geht:
1. Modul aufbauen
Injector injector = Guice.createInjector(new EventModule(), new AbstractModule() { @Override protected void configure() { Events.bindChannel(binder(), Integer.class); } });
Wie man sieht, wird ein Ereignistyp (hier Integer) registriert. Der Kanal kann auch einen Namen tragen:
Events.bindChannel(binder(), Integer.class, "TOPIC1");
2. Der Kanal wird nun injziert und man kann Ereignisse versenden:
public class Supplier { @Inject Supplier(Channel<Integer> channel) { // Send an event to this channel (i.e. to all its consumers) channel.publish(10); ... } ... }
3. Zum Empfang:
public class MyClass { @Consumes public void push(Integer event) { ... } ... }