diff --git a/spring-messaging/src/main/java/org/springframework/messaging/support/ChannelInterceptor.java b/spring-messaging/src/main/java/org/springframework/messaging/support/ChannelInterceptor.java index 965872d264..b3fe57bc98 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/support/ChannelInterceptor.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/support/ChannelInterceptor.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original author or authors. + * Copyright 2002-2018 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,6 +28,8 @@ import org.springframework.messaging.MessageChannel; * @author Mark Fisher * @author Rossen Stoyanchev * @since 4.0 + * @see Message + * @see MessageChannel */ public interface ChannelInterceptor { @@ -56,8 +58,8 @@ public interface ChannelInterceptor { * completed and returned a Message, i.e. it did not return {@code null}. * @since 4.1 */ - default void afterSendCompletion(Message message, MessageChannel channel, boolean sent, - @Nullable Exception ex) { + default void afterSendCompletion( + Message message, MessageChannel channel, boolean sent, @Nullable Exception ex) { } /** diff --git a/spring-messaging/src/main/java/org/springframework/messaging/support/ExecutorChannelInterceptor.java b/spring-messaging/src/main/java/org/springframework/messaging/support/ExecutorChannelInterceptor.java index 298115770a..e7d7e97ceb 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/support/ExecutorChannelInterceptor.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/support/ExecutorChannelInterceptor.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original author or authors. + * Copyright 2002-2018 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,10 +26,13 @@ import org.springframework.messaging.MessageHandler; * asynchronous sending of a {@link org.springframework.messaging.Message} to * a specific subscriber through an {@link java.util.concurrent.Executor}. * Supported on {@link org.springframework.messaging.MessageChannel} - * implementations that can be configured with an Executor. + * implementations that can be configured with an {@code Executor}. * * @author Rossen Stoyanchev * @since 4.1 + * @see Message + * @see MessageChannel + * @see MessageHandler */ public interface ExecutorChannelInterceptor extends ChannelInterceptor { @@ -44,7 +47,9 @@ public interface ExecutorChannelInterceptor extends ChannelInterceptor { * @return the input message, or a new instance, or {@code null} */ @Nullable - Message beforeHandle(Message message, MessageChannel channel, MessageHandler handler); + default Message beforeHandle(Message message, MessageChannel channel, MessageHandler handler) { + return message; + } /** * Invoked inside the {@link Runnable} submitted to the Executor after calling @@ -57,6 +62,8 @@ public interface ExecutorChannelInterceptor extends ChannelInterceptor { * @param handler the target handler that handled the message * @param ex any exception that may been raised by the handler */ - void afterMessageHandled(Message message, MessageChannel channel, MessageHandler handler, @Nullable Exception ex); + default void afterMessageHandled( + Message message, MessageChannel channel, MessageHandler handler, @Nullable Exception ex) { + } } diff --git a/spring-messaging/src/test/java/org/springframework/messaging/simp/broker/SimpleBrokerMessageHandlerTests.java b/spring-messaging/src/test/java/org/springframework/messaging/simp/broker/SimpleBrokerMessageHandlerTests.java index 86d8b4f0fe..0b9966a965 100644 --- a/spring-messaging/src/test/java/org/springframework/messaging/simp/broker/SimpleBrokerMessageHandlerTests.java +++ b/spring-messaging/src/test/java/org/springframework/messaging/simp/broker/SimpleBrokerMessageHandlerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2016 the original author or authors. + * Copyright 2002-2018 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -38,23 +38,11 @@ import org.springframework.messaging.simp.TestPrincipal; import org.springframework.messaging.support.MessageBuilder; import org.springframework.scheduling.TaskScheduler; -import static org.junit.Assert.assertArrayEquals; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertSame; -import static org.junit.Assert.assertTrue; -import static org.mockito.Mockito.any; -import static org.mockito.Mockito.atLeast; -import static org.mockito.Mockito.eq; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyNoMoreInteractions; -import static org.mockito.Mockito.when; +import static org.junit.Assert.*; +import static org.mockito.Mockito.*; /** - * Unit tests for SimpleBrokerMessageHandler. + * Unit tests for {@link SimpleBrokerMessageHandler}. * * @author Rossen Stoyanchev * @since 4.0 @@ -89,8 +77,7 @@ public class SimpleBrokerMessageHandlerTests { @Test - public void subcribePublish() { - + public void subscribePublish() { this.messageHandler.start(); this.messageHandler.handleMessage(createSubscriptionMessage("sess1", "sub1", "/foo")); @@ -114,8 +101,7 @@ public class SimpleBrokerMessageHandlerTests { } @Test - public void subcribeDisconnectPublish() { - + public void subscribeDisconnectPublish() { String sess1 = "sess1"; String sess2 = "sess2"; @@ -153,7 +139,6 @@ public class SimpleBrokerMessageHandlerTests { @Test public void connect() { - this.messageHandler.start(); String id = "sess1"; @@ -173,10 +158,8 @@ public class SimpleBrokerMessageHandlerTests { } @Test - public void heartbeatValueWithAndWithoutTaskScheduler() throws Exception { - + public void heartbeatValueWithAndWithoutTaskScheduler() { assertNull(this.messageHandler.getHeartbeatValue()); - this.messageHandler.setTaskScheduler(this.taskScheduler); assertNotNull(this.messageHandler.getHeartbeatValue()); @@ -184,15 +167,14 @@ public class SimpleBrokerMessageHandlerTests { } @Test(expected = IllegalArgumentException.class) - public void startWithHeartbeatValueWithoutTaskScheduler() throws Exception { + public void startWithHeartbeatValueWithoutTaskScheduler() { this.messageHandler.setHeartbeatValue(new long[] {10000, 10000}); this.messageHandler.start(); } @SuppressWarnings("unchecked") @Test - public void startAndStopWithHeartbeatValue() throws Exception { - + public void startAndStopWithHeartbeatValue() { ScheduledFuture future = mock(ScheduledFuture.class); when(this.taskScheduler.scheduleWithFixedDelay(any(Runnable.class), eq(15000L))).thenReturn(future); @@ -211,8 +193,7 @@ public class SimpleBrokerMessageHandlerTests { @SuppressWarnings("unchecked") @Test - public void startWithOneZeroHeartbeatValue() throws Exception { - + public void startWithOneZeroHeartbeatValue() { this.messageHandler.setTaskScheduler(this.taskScheduler); this.messageHandler.setHeartbeatValue(new long[] {0, 10000}); this.messageHandler.start(); @@ -222,7 +203,6 @@ public class SimpleBrokerMessageHandlerTests { @Test public void readInactivity() throws Exception { - this.messageHandler.setHeartbeatValue(new long[] {0, 1}); this.messageHandler.setTaskScheduler(this.taskScheduler); this.messageHandler.start(); @@ -254,7 +234,6 @@ public class SimpleBrokerMessageHandlerTests { @Test public void writeInactivity() throws Exception { - this.messageHandler.setHeartbeatValue(new long[] {1, 0}); this.messageHandler.setTaskScheduler(this.taskScheduler); this.messageHandler.start(); @@ -286,7 +265,6 @@ public class SimpleBrokerMessageHandlerTests { @Test public void readWriteIntervalCalculation() throws Exception { - this.messageHandler.setHeartbeatValue(new long[] {1, 1}); this.messageHandler.setTaskScheduler(this.taskScheduler); this.messageHandler.start(); @@ -311,9 +289,10 @@ public class SimpleBrokerMessageHandlerTests { messages.get(0).getHeaders().get(SimpMessageHeaderAccessor.MESSAGE_TYPE_HEADER)); } - private Message createSubscriptionMessage(String sessionId, String subcriptionId, String destination) { + + private Message createSubscriptionMessage(String sessionId, String subscriptionId, String destination) { SimpMessageHeaderAccessor headers = SimpMessageHeaderAccessor.create(SimpMessageType.SUBSCRIBE); - headers.setSubscriptionId(subcriptionId); + headers.setSubscriptionId(subscriptionId); headers.setDestination(destination); headers.setSessionId(sessionId); return MessageBuilder.createMessage("", headers.getMessageHeaders()); @@ -333,11 +312,11 @@ public class SimpleBrokerMessageHandlerTests { return MessageBuilder.createMessage(payload, headers.getMessageHeaders()); } - private boolean messageCaptured(String sessionId, String subcriptionId, String destination) { + private boolean messageCaptured(String sessionId, String subscriptionId, String destination) { for (Message message : this.messageCaptor.getAllValues()) { SimpMessageHeaderAccessor headers = SimpMessageHeaderAccessor.wrap(message); if (sessionId.equals(headers.getSessionId())) { - if (subcriptionId.equals(headers.getSubscriptionId())) { + if (subscriptionId.equals(headers.getSubscriptionId())) { if (destination.equals(headers.getDestination())) { return true; } diff --git a/spring-messaging/src/test/java/org/springframework/messaging/simp/config/MessageBrokerConfigurationTests.java b/spring-messaging/src/test/java/org/springframework/messaging/simp/config/MessageBrokerConfigurationTests.java index d2deb40492..760ca36647 100644 --- a/spring-messaging/src/test/java/org/springframework/messaging/simp/config/MessageBrokerConfigurationTests.java +++ b/spring-messaging/src/test/java/org/springframework/messaging/simp/config/MessageBrokerConfigurationTests.java @@ -117,12 +117,10 @@ public class MessageBrokerConfigurationTests { AbstractSubscribableChannel channel = context.getBean( "clientInboundChannel", AbstractSubscribableChannel.class); - assertEquals(3, channel.getInterceptors().size()); CustomThreadPoolTaskExecutor taskExecutor = context.getBean( "clientInboundChannelExecutor", CustomThreadPoolTaskExecutor.class); - assertEquals(11, taskExecutor.getCorePoolSize()); assertEquals(12, taskExecutor.getMaxPoolSize()); assertEquals(13, taskExecutor.getKeepAliveSeconds()); @@ -480,7 +478,6 @@ public class MessageBrokerConfigurationTests { TestChannel outChannel = context.getBean("clientOutboundChannel", TestChannel.class); MessageChannel brokerChannel = context.getBean("brokerChannel", MessageChannel.class); - // 1. Subscribe to user destination StompHeaderAccessor headers = StompHeaderAccessor.create(StompCommand.SUBSCRIBE); @@ -506,7 +503,6 @@ public class MessageBrokerConfigurationTests { assertEquals(expectLeadingSlash ? "/queue.q1-usersess1" : "queue.q1-usersess1", headers.getDestination()); assertEquals("123", new String((byte[]) outputMessage.getPayload())); - // 3. Send message via broker channel SimpMessagingTemplate template = new SimpMessagingTemplate(brokerChannel); diff --git a/spring-messaging/src/test/java/org/springframework/messaging/simp/stomp/StompBrokerRelayMessageHandlerIntegrationTests.java b/spring-messaging/src/test/java/org/springframework/messaging/simp/stomp/StompBrokerRelayMessageHandlerIntegrationTests.java index 07ca65d480..ead4eb6cf7 100644 --- a/spring-messaging/src/test/java/org/springframework/messaging/simp/stomp/StompBrokerRelayMessageHandlerIntegrationTests.java +++ b/spring-messaging/src/test/java/org/springframework/messaging/simp/stomp/StompBrokerRelayMessageHandlerIntegrationTests.java @@ -49,9 +49,7 @@ import org.springframework.messaging.support.MessageBuilder; import org.springframework.util.Assert; import org.springframework.util.SocketUtils; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.*; /** * Integration tests for {@link StompBrokerRelayMessageHandler} running against ActiveMQ. @@ -79,7 +77,7 @@ public class StompBrokerRelayMessageHandlerIntegrationTests { @Before - public void setUp() throws Exception { + public void setup() throws Exception { logger.debug("Setting up before '" + this.testName.getMethodName() + "'"); this.port = SocketUtils.findAvailableTcpPort(61613); this.responseChannel = new ExecutorSubscribableChannel(); @@ -114,7 +112,7 @@ public class StompBrokerRelayMessageHandlerIntegrationTests { } @After - public void tearDown() throws Exception { + public void stop() throws Exception { try { logger.debug("STOMP broker relay stats: " + this.relay.getStatsInfo()); this.relay.stop(); @@ -168,7 +166,6 @@ public class StompBrokerRelayMessageHandlerIntegrationTests { @Test(expected = MessageDeliveryException.class) public void messageDeliveryExceptionIfSystemSessionForwardFails() throws Exception { - logger.debug("Starting test messageDeliveryExceptionIfSystemSessionForwardFails()"); stopActiveMqBrokerAndAwait(); @@ -179,8 +176,8 @@ public class StompBrokerRelayMessageHandlerIntegrationTests { } @Test - public void brokerBecomingUnvailableTriggersErrorFrame() throws Exception { - logger.debug("Starting test brokerBecomingUnvailableTriggersErrorFrame()"); + public void brokerBecomingUnavailableTriggersErrorFrame() throws Exception { + logger.debug("Starting test brokerBecomingUnavailableTriggersErrorFrame()"); String sess1 = "sess1"; MessageExchange connect = MessageExchangeBuilder.connect(sess1).build(); diff --git a/spring-messaging/src/test/java/org/springframework/messaging/support/ExecutorSubscribableChannelTests.java b/spring-messaging/src/test/java/org/springframework/messaging/support/ExecutorSubscribableChannelTests.java index 1206ebe60c..08ac50969b 100644 --- a/spring-messaging/src/test/java/org/springframework/messaging/support/ExecutorSubscribableChannelTests.java +++ b/spring-messaging/src/test/java/org/springframework/messaging/support/ExecutorSubscribableChannelTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2014 the original author or authors. + * Copyright 2002-2018 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -65,8 +65,9 @@ public class ExecutorSubscribableChannelTests { MockitoAnnotations.initMocks(this); } + @Test - public void messageMustNotBeNull() throws Exception { + public void messageMustNotBeNull() { thrown.expect(IllegalArgumentException.class); thrown.expectMessage("Message must not be null"); this.channel.send(null); @@ -84,7 +85,7 @@ public class ExecutorSubscribableChannelTests { } @Test - public void sendWithExecutor() throws Exception { + public void sendWithExecutor() { BeforeHandleInterceptor interceptor = new BeforeHandleInterceptor(); TaskExecutor executor = mock(TaskExecutor.class); ExecutorSubscribableChannel testChannel = new ExecutorSubscribableChannel(executor); @@ -100,7 +101,7 @@ public class ExecutorSubscribableChannelTests { } @Test - public void subscribeTwice() throws Exception { + public void subscribeTwice() { assertThat(this.channel.subscribe(this.handler), equalTo(true)); assertThat(this.channel.subscribe(this.handler), equalTo(false)); this.channel.send(this.message); @@ -108,7 +109,7 @@ public class ExecutorSubscribableChannelTests { } @Test - public void unsubscribeTwice() throws Exception { + public void unsubscribeTwice() { this.channel.subscribe(this.handler); assertThat(this.channel.unsubscribe(this.handler), equalTo(true)); assertThat(this.channel.unsubscribe(this.handler), equalTo(false)); @@ -117,7 +118,7 @@ public class ExecutorSubscribableChannelTests { } @Test - public void failurePropagates() throws Exception { + public void failurePropagates() { RuntimeException ex = new RuntimeException(); willThrow(ex).given(this.handler).handleMessage(this.message); MessageHandler secondHandler = mock(MessageHandler.class); @@ -133,7 +134,7 @@ public class ExecutorSubscribableChannelTests { } @Test - public void concurrentModification() throws Exception { + public void concurrentModification() { this.channel.subscribe(message1 -> channel.unsubscribe(handler)); this.channel.subscribe(this.handler); this.channel.send(this.message); @@ -208,8 +209,8 @@ public class ExecutorSubscribableChannelTests { } @Override - public void afterMessageHandled(Message message, MessageChannel channel, MessageHandler handler, - Exception ex) { + public void afterMessageHandled( + Message message, MessageChannel channel, MessageHandler handler, Exception ex) { this.afterHandledInvoked = true; } diff --git a/spring-websocket/src/test/java/org/springframework/web/socket/config/MessageBrokerBeanDefinitionParserTests.java b/spring-websocket/src/test/java/org/springframework/web/socket/config/MessageBrokerBeanDefinitionParserTests.java index fbdcea74fb..1279f4ca53 100644 --- a/spring-websocket/src/test/java/org/springframework/web/socket/config/MessageBrokerBeanDefinitionParserTests.java +++ b/spring-websocket/src/test/java/org/springframework/web/socket/config/MessageBrokerBeanDefinitionParserTests.java @@ -94,8 +94,8 @@ import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; /** - * Test fixture for MessageBrokerBeanDefinitionParser. - * See test configuration files websocket-config-broker-*.xml. + * Test fixture for {@link MessageBrokerBeanDefinitionParser}. + * Also see test configuration files websocket-config-broker-*.xml. * * @author Brian Clozel * @author Artem Bilan @@ -208,8 +208,7 @@ public class MessageBrokerBeanDefinitionParserTests { assertNotNull(brokerMessageHandler.getTaskScheduler()); assertArrayEquals(new long[] {15000, 15000}, brokerMessageHandler.getHeartbeatValue()); - List> subscriberTypes = - Arrays.>asList(SimpAnnotationMethodMessageHandler.class, + List> subscriberTypes = Arrays.asList(SimpAnnotationMethodMessageHandler.class, UserDestinationMessageHandler.class, SimpleBrokerMessageHandler.class); testChannel("clientInboundChannel", subscriberTypes, 2); testExecutor("clientInboundChannel", Runtime.getRuntime().availableProcessors() * 2, Integer.MAX_VALUE, 60); @@ -218,8 +217,7 @@ public class MessageBrokerBeanDefinitionParserTests { testChannel("clientOutboundChannel", subscriberTypes, 1); testExecutor("clientOutboundChannel", Runtime.getRuntime().availableProcessors() * 2, Integer.MAX_VALUE, 60); - subscriberTypes = Arrays.>asList( - SimpleBrokerMessageHandler.class, UserDestinationMessageHandler.class); + subscriberTypes = Arrays.asList(SimpleBrokerMessageHandler.class, UserDestinationMessageHandler.class); testChannel("brokerChannel", subscriberTypes, 1); try { this.appContext.getBean("brokerChannelExecutor", ThreadPoolTaskExecutor.class); @@ -278,9 +276,8 @@ public class MessageBrokerBeanDefinitionParserTests { assertEquals(5000, messageBroker.getSystemHeartbeatSendInterval()); assertThat(messageBroker.getDestinationPrefixes(), Matchers.containsInAnyOrder("/topic","/queue")); - List> subscriberTypes = Arrays.asList( - SimpAnnotationMethodMessageHandler.class, UserDestinationMessageHandler.class, - StompBrokerRelayMessageHandler.class); + List> subscriberTypes = Arrays.asList(SimpAnnotationMethodMessageHandler.class, + UserDestinationMessageHandler.class, StompBrokerRelayMessageHandler.class); testChannel("clientInboundChannel", subscriberTypes, 2); testExecutor("clientInboundChannel", Runtime.getRuntime().availableProcessors() * 2, Integer.MAX_VALUE, 60); @@ -379,9 +376,8 @@ public class MessageBrokerBeanDefinitionParserTests { assertSame(this.appContext.getBean("myValidator"), validator); assertThat(validator, Matchers.instanceOf(TestValidator.class)); - List> subscriberTypes = - Arrays.>asList(SimpAnnotationMethodMessageHandler.class, - UserDestinationMessageHandler.class, SimpleBrokerMessageHandler.class); + List> subscriberTypes = Arrays.asList(SimpAnnotationMethodMessageHandler.class, + UserDestinationMessageHandler.class, SimpleBrokerMessageHandler.class); testChannel("clientInboundChannel", subscriberTypes, 3); testExecutor("clientInboundChannel", 100, 200, 600); @@ -391,16 +387,13 @@ public class MessageBrokerBeanDefinitionParserTests { testChannel("clientOutboundChannel", subscriberTypes, 3); testExecutor("clientOutboundChannel", 101, 201, 601); - subscriberTypes = Arrays.>asList(SimpleBrokerMessageHandler.class, - UserDestinationMessageHandler.class); + subscriberTypes = Arrays.asList(SimpleBrokerMessageHandler.class, UserDestinationMessageHandler.class); testChannel("brokerChannel", subscriberTypes, 1); testExecutor("brokerChannel", 102, 202, 602); } - // SPR-11623 - - @Test + @Test // SPR-11623 public void customChannelsWithDefaultExecutor() { loadBeanDefinitions("websocket-config-broker-customchannels-default-executor.xml"); diff --git a/spring-websocket/src/test/java/org/springframework/web/socket/messaging/StompWebSocketIntegrationTests.java b/spring-websocket/src/test/java/org/springframework/web/socket/messaging/StompWebSocketIntegrationTests.java index d8332bed29..cb31b8164b 100644 --- a/spring-websocket/src/test/java/org/springframework/web/socket/messaging/StompWebSocketIntegrationTests.java +++ b/spring-websocket/src/test/java/org/springframework/web/socket/messaging/StompWebSocketIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original author or authors. + * Copyright 2002-2018 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -57,8 +57,8 @@ import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerCo import org.springframework.web.socket.handler.TextWebSocketHandler; import org.springframework.web.socket.server.HandshakeHandler; -import static org.junit.Assert.assertTrue; -import static org.springframework.web.socket.messaging.StompTextMessageBuilder.create; +import static org.junit.Assert.*; +import static org.springframework.web.socket.messaging.StompTextMessageBuilder.*; /** * Integration tests with annotated message-handling methods. @@ -70,6 +70,7 @@ public class StompWebSocketIntegrationTests extends AbstractWebSocketIntegration private static final long TIMEOUT = 10; + @Parameters(name = "server [{0}], client [{1}]") public static Object[][] arguments() { return new Object[][] { @@ -261,7 +262,7 @@ public class StompWebSocketIntegrationTests extends AbstractWebSocketIntegration } - static interface ScopedBean { + interface ScopedBean { String getValue(); } @@ -315,9 +316,9 @@ public class StompWebSocketIntegrationTests extends AbstractWebSocketIntegration @Configuration @ComponentScan( - basePackageClasses=StompWebSocketIntegrationTests.class, - useDefaultFilters=false, - includeFilters=@ComponentScan.Filter(IntegrationTestController.class)) + basePackageClasses = StompWebSocketIntegrationTests.class, + useDefaultFilters = false, + includeFilters = @ComponentScan.Filter(IntegrationTestController.class)) static class TestMessageBrokerConfigurer implements WebSocketMessageBrokerConfigurer { @Autowired