introduced specialized subscriptions for better performance and customization options

This commit is contained in:
benni 2012-11-17 12:13:55 +01:00
parent 014f22df9e
commit 2ae0e5fae0
3 changed files with 114 additions and 0 deletions

View File

@ -0,0 +1,33 @@
package org.mbassy.subscription;
import org.mbassy.IMessageBus;
import org.mbassy.IPublicationErrorHandler;
import org.mbassy.listener.MessageFilter;
import org.mbassy.listener.MessageHandlerMetadata;
import java.lang.reflect.Method;
import java.util.Collection;
/**
* Created with IntelliJ IDEA.
* User: benni
* Date: 11/14/12
* Time: 3:50 PM
* To change this template use File | Settings | File Templates.
*/
public class FilteredAsynchronousSubscription extends FilteredSubscription{
public FilteredAsynchronousSubscription(IMessageBus mBassador, MessageHandlerMetadata messageHandler) {
super(mBassador, messageHandler);
}
protected void dispatch(final Object message, final Object listener){
getMessageBus().getExecutor().execute(new Runnable() {
@Override
public void run() {
invokeHandler(message, listener);
}
});
}
}

View File

@ -0,0 +1,53 @@
package org.mbassy.subscription;
import org.mbassy.IMessageBus;
import org.mbassy.IPublicationErrorHandler;
import org.mbassy.MBassador;
import org.mbassy.listener.MessageFilter;
import org.mbassy.listener.MessageHandlerMetadata;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.Iterator;
/**
* Created with IntelliJ IDEA.
* User: benni
* Date: 11/14/12
* Time: 3:48 PM
* To change this template use File | Settings | File Templates.
*/
public abstract class FilteredSubscription extends Subscription{
private final MessageFilter[] filter;
public FilteredSubscription(IMessageBus mBassador, MessageHandlerMetadata messageHandler) {
super(mBassador, messageHandler);
this.filter = messageHandler.getFilter();
}
private boolean passesFilter(Object message, Object listener) {
if (filter == null) {
return true;
}
else {
for (int i = 0; i < filter.length; i++) {
if (!filter[i].accepts(message, listener)) return false;
}
return true;
}
}
public void publish(Object message) {
Iterator<Object> iterator = listeners.iterator();
Object listener = null;
while ((listener = iterator.next()) != null) {
if(passesFilter(message, listener)) {
dispatch(message, listener);
}
}
}
}

View File

@ -0,0 +1,28 @@
package org.mbassy.subscription;
import org.mbassy.IMessageBus;
import org.mbassy.IPublicationErrorHandler;
import org.mbassy.listener.MessageFilter;
import org.mbassy.listener.MessageHandlerMetadata;
import java.lang.reflect.Method;
import java.util.Collection;
/**
* Created with IntelliJ IDEA.
* User: benni
* Date: 11/14/12
* Time: 3:49 PM
* To change this template use File | Settings | File Templates.
*/
public class FilteredSynchronousSubscription extends FilteredSubscription {
public FilteredSynchronousSubscription(IMessageBus mBassador, MessageHandlerMetadata messageHandler) {
super(mBassador, messageHandler);
}
protected void dispatch(final Object message, final Object listener){
invokeHandler(message, listener);
}
}