Browse Source

Move "handlers" field to AbstractSubscribableChannel

Move the management of subscribers to the abstract parent class where
it belongs.
pull/445/head
Rossen Stoyanchev 12 years ago
parent
commit
e2feed494b
  1. 40
      spring-messaging/src/main/java/org/springframework/messaging/support/AbstractSubscribableChannel.java
  2. 19
      spring-messaging/src/main/java/org/springframework/messaging/support/ExecutorSubscribableChannel.java
  3. 26
      spring-messaging/src/test/java/org/springframework/messaging/simp/config/MessageBrokerConfigurationTests.java
  4. 16
      spring-websocket/src/test/java/org/springframework/web/socket/config/annotation/WebSocketMessageBrokerConfigurationSupportTests.java

40
spring-messaging/src/main/java/org/springframework/messaging/support/AbstractSubscribableChannel.java

@ -19,6 +19,11 @@ package org.springframework.messaging.support;
import org.springframework.messaging.MessageHandler; import org.springframework.messaging.MessageHandler;
import org.springframework.messaging.SubscribableChannel; import org.springframework.messaging.SubscribableChannel;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;
/** /**
* Abstract base class for {@link SubscribableChannel} implementations. * Abstract base class for {@link SubscribableChannel} implementations.
* *
@ -27,9 +32,20 @@ import org.springframework.messaging.SubscribableChannel;
*/ */
public abstract class AbstractSubscribableChannel extends AbstractMessageChannel implements SubscribableChannel { public abstract class AbstractSubscribableChannel extends AbstractMessageChannel implements SubscribableChannel {
private final Set<MessageHandler> handlers = new CopyOnWriteArraySet<MessageHandler>();
public Set<MessageHandler> getSubscribers() {
return Collections.<MessageHandler>unmodifiableSet(this.handlers);
}
public boolean hasSubscription(MessageHandler handler) {
return this.handlers.contains(handler);
}
@Override @Override
public final boolean subscribe(MessageHandler handler) { public boolean subscribe(MessageHandler handler) {
boolean result = subscribeInternal(handler); boolean result = this.handlers.add(handler);
if (result) { if (result) {
if (logger.isDebugEnabled()) { if (logger.isDebugEnabled()) {
logger.debug("[" + getBeanName() + "] subscribed " + handler); logger.debug("[" + getBeanName() + "] subscribed " + handler);
@ -39,8 +55,8 @@ public abstract class AbstractSubscribableChannel extends AbstractMessageChannel
} }
@Override @Override
public final boolean unsubscribe(MessageHandler handler) { public boolean unsubscribe(MessageHandler handler) {
boolean result = unsubscribeInternal(handler); boolean result = this.handlers.remove(handler);
if (result) { if (result) {
if (logger.isDebugEnabled()) { if (logger.isDebugEnabled()) {
logger.debug("[" + getBeanName() + "] unsubscribed " + handler); logger.debug("[" + getBeanName() + "] unsubscribed " + handler);
@ -49,20 +65,4 @@ public abstract class AbstractSubscribableChannel extends AbstractMessageChannel
return result; return result;
} }
/**
* Whether the given {@link MessageHandler} is already subscribed.
*/
public abstract boolean hasSubscription(MessageHandler handler);
/**
* Subscribe the given {@link MessageHandler}.
*/
protected abstract boolean subscribeInternal(MessageHandler handler);
/**
* Unsubscribe the given {@link MessageHandler}.
*/
protected abstract boolean unsubscribeInternal(MessageHandler handler);
} }

19
spring-messaging/src/main/java/org/springframework/messaging/support/ExecutorSubscribableChannel.java

@ -35,8 +35,6 @@ public class ExecutorSubscribableChannel extends AbstractSubscribableChannel {
private final Executor executor; private final Executor executor;
private final Set<MessageHandler> handlers = new CopyOnWriteArraySet<MessageHandler>();
/** /**
* Create a new {@link ExecutorSubscribableChannel} instance where messages will be sent * Create a new {@link ExecutorSubscribableChannel} instance where messages will be sent
@ -61,14 +59,9 @@ public class ExecutorSubscribableChannel extends AbstractSubscribableChannel {
return this.executor; return this.executor;
} }
@Override
public boolean hasSubscription(MessageHandler handler) {
return this.handlers.contains(handler);
}
@Override @Override
public boolean sendInternal(final Message<?> message, long timeout) { public boolean sendInternal(final Message<?> message, long timeout) {
for (final MessageHandler handler : this.handlers) { for (final MessageHandler handler : getSubscribers()) {
if (this.executor == null) { if (this.executor == null) {
handler.handleMessage(message); handler.handleMessage(message);
} }
@ -84,14 +77,4 @@ public class ExecutorSubscribableChannel extends AbstractSubscribableChannel {
return true; return true;
} }
@Override
public boolean subscribeInternal(MessageHandler handler) {
return this.handlers.add(handler);
}
@Override
public boolean unsubscribeInternal(MessageHandler handler) {
return this.handlers.remove(handler);
}
} }

26
spring-messaging/src/test/java/org/springframework/messaging/simp/config/MessageBrokerConfigurationTests.java

@ -19,6 +19,7 @@ package org.springframework.messaging.simp.config;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Set;
import org.hamcrest.Matchers; import org.hamcrest.Matchers;
import org.junit.Before; import org.junit.Before;
@ -93,7 +94,7 @@ public class MessageBrokerConfigurationTests {
public void clientInboundChannel() { public void clientInboundChannel() {
TestChannel channel = this.simpleContext.getBean("clientInboundChannel", TestChannel.class); TestChannel channel = this.simpleContext.getBean("clientInboundChannel", TestChannel.class);
List<MessageHandler> handlers = channel.handlers; Set<MessageHandler> handlers = channel.getSubscribers();
assertEquals(3, handlers.size()); assertEquals(3, handlers.size());
assertTrue(handlers.contains(simpleContext.getBean(SimpAnnotationMethodMessageHandler.class))); assertTrue(handlers.contains(simpleContext.getBean(SimpAnnotationMethodMessageHandler.class)));
@ -104,12 +105,12 @@ public class MessageBrokerConfigurationTests {
@Test @Test
public void clientInboundChannelWithBrokerRelay() { public void clientInboundChannelWithBrokerRelay() {
TestChannel channel = this.brokerRelayContext.getBean("clientInboundChannel", TestChannel.class); TestChannel channel = this.brokerRelayContext.getBean("clientInboundChannel", TestChannel.class);
List<MessageHandler> values = channel.handlers; Set<MessageHandler> handlers = channel.getSubscribers();
assertEquals(3, values.size()); assertEquals(3, handlers.size());
assertTrue(values.contains(brokerRelayContext.getBean(SimpAnnotationMethodMessageHandler.class))); assertTrue(handlers.contains(brokerRelayContext.getBean(SimpAnnotationMethodMessageHandler.class)));
assertTrue(values.contains(brokerRelayContext.getBean(UserDestinationMessageHandler.class))); assertTrue(handlers.contains(brokerRelayContext.getBean(UserDestinationMessageHandler.class)));
assertTrue(values.contains(brokerRelayContext.getBean(StompBrokerRelayMessageHandler.class))); assertTrue(handlers.contains(brokerRelayContext.getBean(StompBrokerRelayMessageHandler.class)));
} }
@Test @Test
@ -197,7 +198,7 @@ public class MessageBrokerConfigurationTests {
@Test @Test
public void brokerChannel() { public void brokerChannel() {
TestChannel channel = this.simpleContext.getBean("brokerChannel", TestChannel.class); TestChannel channel = this.simpleContext.getBean("brokerChannel", TestChannel.class);
List<MessageHandler> handlers = channel.handlers; Set<MessageHandler> handlers = channel.getSubscribers();
assertEquals(2, handlers.size()); assertEquals(2, handlers.size());
assertTrue(handlers.contains(simpleContext.getBean(UserDestinationMessageHandler.class))); assertTrue(handlers.contains(simpleContext.getBean(UserDestinationMessageHandler.class)));
@ -207,7 +208,7 @@ public class MessageBrokerConfigurationTests {
@Test @Test
public void brokerChannelWithBrokerRelay() { public void brokerChannelWithBrokerRelay() {
TestChannel channel = this.brokerRelayContext.getBean("brokerChannel", TestChannel.class); TestChannel channel = this.brokerRelayContext.getBean("brokerChannel", TestChannel.class);
List<MessageHandler> handlers = channel.handlers; Set<MessageHandler> handlers = channel.getSubscribers();
assertEquals(2, handlers.size()); assertEquals(2, handlers.size());
assertTrue(handlers.contains(brokerRelayContext.getBean(UserDestinationMessageHandler.class))); assertTrue(handlers.contains(brokerRelayContext.getBean(UserDestinationMessageHandler.class)));
@ -451,17 +452,8 @@ public class MessageBrokerConfigurationTests {
private static class TestChannel extends ExecutorSubscribableChannel { private static class TestChannel extends ExecutorSubscribableChannel {
private final List<MessageHandler> handlers = new ArrayList<>();
private final List<Message<?>> messages = new ArrayList<>(); private final List<Message<?>> messages = new ArrayList<>();
@Override
public boolean subscribeInternal(MessageHandler handler) {
this.handlers.add(handler);
return super.subscribeInternal(handler);
}
@Override @Override
public boolean sendInternal(Message<?> message, long timeout) { public boolean sendInternal(Message<?> message, long timeout) {
this.messages.add(message); this.messages.add(message);

16
spring-websocket/src/test/java/org/springframework/web/socket/config/annotation/WebSocketMessageBrokerConfigurationSupportTests.java

@ -19,6 +19,7 @@ package org.springframework.web.socket.config.annotation;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@ -95,10 +96,10 @@ public class WebSocketMessageBrokerConfigurationSupportTests {
@Test @Test
public void clientOutboundChannelChannel() { public void clientOutboundChannelChannel() {
TestChannel channel = this.config.getBean("clientOutboundChannel", TestChannel.class); TestChannel channel = this.config.getBean("clientOutboundChannel", TestChannel.class);
List<MessageHandler> values = channel.handlers; Set<MessageHandler> handlers = channel.getSubscribers();
assertEquals(1, values.size()); assertEquals(1, handlers.size());
assertTrue(values.get(0) instanceof SubProtocolWebSocketHandler); assertTrue(handlers.iterator().next() instanceof SubProtocolWebSocketHandler);
} }
@ -155,17 +156,8 @@ public class WebSocketMessageBrokerConfigurationSupportTests {
private static class TestChannel extends ExecutorSubscribableChannel { private static class TestChannel extends ExecutorSubscribableChannel {
private final List<MessageHandler> handlers = new ArrayList<>();
private final List<Message<?>> messages = new ArrayList<>(); private final List<Message<?>> messages = new ArrayList<>();
@Override
public boolean subscribeInternal(MessageHandler handler) {
this.handlers.add(handler);
return super.subscribeInternal(handler);
}
@Override @Override
public boolean sendInternal(Message<?> message, long timeout) { public boolean sendInternal(Message<?> message, long timeout) {
this.messages.add(message); this.messages.add(message);

Loading…
Cancel
Save