INT-1814 added INFO message when DirectChannel has more then one subscriber
This commit is contained in:
@@ -46,7 +46,7 @@ import org.springframework.util.StringUtils;
|
||||
*/
|
||||
public abstract class AbstractMessageChannel extends IntegrationObjectSupport implements MessageChannel, TrackableComponent {
|
||||
|
||||
private final Log logger = LogFactory.getLog(this.getClass());
|
||||
protected final Log logger = LogFactory.getLog(this.getClass());
|
||||
|
||||
private volatile boolean shouldTrack = false;
|
||||
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
|
||||
package org.springframework.integration.channel;
|
||||
|
||||
import org.springframework.integration.core.MessageHandler;
|
||||
import org.springframework.integration.dispatcher.LoadBalancingStrategy;
|
||||
import org.springframework.integration.dispatcher.RoundRobinLoadBalancingStrategy;
|
||||
import org.springframework.integration.dispatcher.UnicastingDispatcher;
|
||||
@@ -33,6 +34,14 @@ public class DirectChannel extends AbstractSubscribableChannel {
|
||||
|
||||
private final UnicastingDispatcher dispatcher = new UnicastingDispatcher();
|
||||
|
||||
public boolean subscribe(MessageHandler handler) {
|
||||
|
||||
if (this.getDispatcher().size() > 0){
|
||||
this.logger.info("DirectChannel has more then 1 subscriber. " +
|
||||
"Incoming messages will be dispatched between all subscribers following the load-balancing strategy.");
|
||||
}
|
||||
return super.subscribe(handler);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a channel with default {@link RoundRobinLoadBalancingStrategy}
|
||||
|
||||
@@ -77,4 +77,7 @@ public abstract class AbstractDispatcher implements MessageDispatcher {
|
||||
return this.getClass().getSimpleName() + " with handlers: " + this.handlers.toString();
|
||||
}
|
||||
|
||||
public int size(){
|
||||
return this.handlers.toArray().length;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,11 +18,17 @@ package org.springframework.integration.channel;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.times;
|
||||
import static org.mockito.Mockito.verify;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.junit.Test;
|
||||
import org.mockito.Mockito;
|
||||
|
||||
import org.springframework.beans.DirectFieldAccessor;
|
||||
import org.springframework.integration.Message;
|
||||
@@ -30,6 +36,9 @@ import org.springframework.integration.core.MessageHandler;
|
||||
import org.springframework.integration.dispatcher.RoundRobinLoadBalancingStrategy;
|
||||
import org.springframework.integration.dispatcher.UnicastingDispatcher;
|
||||
import org.springframework.integration.message.GenericMessage;
|
||||
import org.springframework.integration.test.util.TestUtils;
|
||||
import org.springframework.util.ReflectionUtils;
|
||||
import org.springframework.util.ReflectionUtils.FieldCallback;
|
||||
|
||||
/**
|
||||
* @author Mark Fisher
|
||||
@@ -51,6 +60,26 @@ public class DirectChannelTests {
|
||||
Object loadBalancingStrategy = dispatcherAccessor.getPropertyValue("loadBalancingStrategy");
|
||||
assertTrue(loadBalancingStrategy instanceof RoundRobinLoadBalancingStrategy);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testWithMoreThenOneSubscriber() {
|
||||
final DirectChannel channel = new DirectChannel();
|
||||
final Log logger = mock(Log.class);
|
||||
ReflectionUtils.doWithFields(AbstractMessageChannel.class, new FieldCallback() {
|
||||
|
||||
public void doWith(Field field) throws IllegalArgumentException,
|
||||
IllegalAccessException {
|
||||
if ("logger".equals(field.getName())){
|
||||
field.setAccessible(true);
|
||||
field.set(channel, logger);
|
||||
}
|
||||
}
|
||||
});
|
||||
channel.subscribe(mock(MessageHandler.class));
|
||||
verify(logger, times(0)).info(Mockito.anyString());
|
||||
channel.subscribe(mock(MessageHandler.class));
|
||||
verify(logger, times(1)).info(Mockito.anyString());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSendInSeparateThread() throws InterruptedException {
|
||||
|
||||
Reference in New Issue
Block a user