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)
{
...
}
...
}