diff --git a/README.md b/README.md index 9019247..ed832fc 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,11 @@ Mbassador ========= -Mbassador is a very light-weight message bus implementation following the publish subscribe pattern. It is designed -for ease of use and aims to be resource efficient and very fast. At its core it offers the following: +Mbassador is a very light-weight message bus (event bus) implementation following the publish subscribe pattern. It is designed +for ease of use and aims to be feature rich, extensible while preserving resource efficiency and performance. +Check out the [performance comparison](http://codeblock.engio.net/?p=37) which also reviews part of the features of the compared implementations + +At its core it offers the following: + Annotation driven: To define and customize a message handler simply mark it with @Listener annotation + Delivers everything: Messages must not implement any interface and can be of any type (-> message bus is typed using generics with upper @@ -17,6 +20,7 @@ in certain environments where objects are created by frameworks, i.e. spring, gu ignore objects without message handlers and automatically clean-up orphaned weak references after the garbage collector has done its job. + Filtering: Mbassador offers static message filtering. Filters are configured using annotations and multiple filters can be attached to a single message handler ++ Handler priorities: A listener can be associated with a priority to influence the order of the message delivery + Error handling: Errors during message delivery are sent to an error handler of which a custom implementation can easily be plugged-in. + Ease of Use: Using Mbassador in your project is very easy. Create as many instances of Mbassador as you like (usually a singleton will do), mark and configure your message handlers with @Listener annotations and finally register the listeners at any Mbassador instance. Start @@ -36,14 +40,16 @@ Listener definition (in any bean): } // this handler will be invoked asynchronously - @Listener(mode = Listener.Dispatch.Asynchronous) + @Listener(dispatch = Mode.Asynchronous) public void handleSubTestEvent(SubTestEvent event) { // do something more expensive here } // this handler will receive events of type SubTestEvent // or any subtabe and that passes the given filter(s) - @Listener({@Filter(SpecialEventsOnly.class),@Filter(AnotherFilter.class)}) + @Listener(priority = 10, + dispatch = Mode.Synchronous, + filters = {@Filter(MessageFilter.None.class),@Filter(MessageFilter.All.class)}) public void handleFiltered(SubTestEvent event) { //do something special here } @@ -52,7 +58,7 @@ Creation of message bus and registration of listeners: // create as many instances as necessary // bind it to any upper bound - MBassador bus = new MBassador bus = new MBassador(); ListeningBean listener = new ListeningBean(); // the listener will be registered using a weak-reference bus.subscribe(listener); @@ -66,13 +72,14 @@ Message publication: TestEvent subEvent = new SubTestEvent(); bus.publishAsync(event); //returns immediately, publication will continue asynchronously + bus.post(event).asynchronously(); // same as above bus.publish(subEvent); // will return after each handler has been invoked + bus.post(subEvent).now(); // same as above

Planned features

+ Maven dependency: Add Mbassador to your project using maven. Coming soon! -+ Message handler priority: Message handlers can specify priority to influence order of message delivery + Spring integration with support for conditional message dispatch in transactional context (dispatch only after successful commit etc.)