@Override public boolean subscribe(MessageHandler handler) { return this.dispatcher.addHandler(handler); }
@Test public void noDuplicateSubscription() { dispatcher = new BroadcastingDispatcher(taskExecutorMock); dispatcher.addHandler(targetMock1); dispatcher.addHandler(targetMock1); dispatcher.addHandler(targetMock1); dispatcher.dispatch(messageMock); verify(targetMock1).handleMessage(eq(messageMock)); }
@Test public void multipleTargetsWithoutTaskExecutor() { dispatcher = new BroadcastingDispatcher(); dispatcher.addHandler(targetMock1); dispatcher.addHandler(targetMock2); dispatcher.addHandler(targetMock3); dispatcher.dispatch(messageMock); verify(targetMock1).handleMessage(eq(messageMock)); verify(targetMock2).handleMessage(eq(messageMock)); verify(targetMock3).handleMessage(eq(messageMock)); }
@Test public void multipleTargetsPartialFailureFirst() { dispatcher = new BroadcastingDispatcher(taskExecutorMock); dispatcher.addHandler(targetMock1); dispatcher.addHandler(targetMock2); dispatcher.addHandler(targetMock3); partialFailingExecutorMock(false, true, true); dispatcher.dispatch(messageMock); verify(targetMock1, Mockito.never()).handleMessage(eq(messageMock)); verify(targetMock2).handleMessage(eq(messageMock)); verify(targetMock3).handleMessage(eq(messageMock)); }
@Test public void multipleTargetsWithTaskExecutor() { dispatcher = new BroadcastingDispatcher(taskExecutorMock); dispatcher.addHandler(targetMock1); dispatcher.addHandler(targetMock2); dispatcher.addHandler(targetMock3); dispatcher.dispatch(messageMock); verify(targetMock1).handleMessage(eq(messageMock)); verify(targetMock2).handleMessage(eq(messageMock)); verify(targetMock3).handleMessage(eq(messageMock)); }
@Test public void multipleTargetsAllFail() { dispatcher = new BroadcastingDispatcher(taskExecutorMock); dispatcher.addHandler(targetMock1); dispatcher.addHandler(targetMock2); dispatcher.addHandler(targetMock3); partialFailingExecutorMock(false, false, false); dispatcher.dispatch(messageMock); verify(targetMock1, Mockito.never()).handleMessage(eq(messageMock)); verify(targetMock2, Mockito.never()).handleMessage(eq(messageMock)); verify(targetMock3, Mockito.never()).handleMessage(eq(messageMock)); }
@Test public void multipleTargetsPartialFailureMiddle() { dispatcher = new BroadcastingDispatcher(taskExecutorMock); dispatcher.addHandler(targetMock1); dispatcher.addHandler(targetMock2); dispatcher.addHandler(targetMock3); partialFailingExecutorMock(true, false, true); dispatcher.dispatch(messageMock); verify(targetMock1).handleMessage(eq(messageMock)); verify(targetMock2, Mockito.never()).handleMessage(eq(messageMock)); verify(targetMock3).handleMessage(eq(messageMock)); }
@Test public void multipleTargetsPartialFailureLast() { dispatcher = new BroadcastingDispatcher(taskExecutorMock); dispatcher.addHandler(targetMock1); dispatcher.addHandler(targetMock2); dispatcher.addHandler(targetMock3); partialFailingExecutorMock(true, true, false); dispatcher.dispatch(messageMock); verify(targetMock1).handleMessage(eq(messageMock)); verify(targetMock2).handleMessage(eq(messageMock)); verify(targetMock3, Mockito.never()).handleMessage(eq(messageMock)); }
@Test public void removeConsumerBeforeSend() { dispatcher = new BroadcastingDispatcher(taskExecutorMock); dispatcher.addHandler(targetMock1); dispatcher.addHandler(targetMock2); dispatcher.addHandler(targetMock3); dispatcher.removeHandler(targetMock2); dispatcher.dispatch(messageMock); verify(targetMock1).handleMessage(eq(messageMock)); verify(targetMock2, Mockito.never()).handleMessage(eq(messageMock)); verify(targetMock3).handleMessage(eq(messageMock)); }
@Test public void removeConsumerBetweenSends() { dispatcher = new BroadcastingDispatcher(taskExecutorMock); dispatcher.addHandler(targetMock1); dispatcher.addHandler(targetMock2); dispatcher.addHandler(targetMock3); dispatcher.dispatch(messageMock); dispatcher.removeHandler(targetMock2); dispatcher.dispatch(messageMock); verify(targetMock1, Mockito.times(2)).handleMessage(eq(messageMock)); verify(targetMock2).handleMessage(eq(messageMock)); verify(targetMock3, Mockito.times(2)).handleMessage(eq(messageMock)); }
@Test public void singleTargetWithTaskExecutor() throws Exception { dispatcher = new BroadcastingDispatcher(taskExecutorMock); dispatcher.addHandler(targetMock1); dispatcher.dispatch(messageMock); verify(targetMock1).handleMessage(eq(messageMock)); }
@Test public void singleTargetWithoutTaskExecutor() throws Exception { dispatcher = new BroadcastingDispatcher(); dispatcher.addHandler(targetMock1); dispatcher.dispatch(messageMock); verify(targetMock1).handleMessage(eq(messageMock)); }
@Override public boolean subscribe(MessageHandler handler) { return this.dispatcher.addHandler(handler); }
@Test public void applySequenceDisabledByDefault() { BroadcastingDispatcher dispatcher = new BroadcastingDispatcher(); final List<Message<?>> messages = Collections.synchronizedList(new ArrayList<Message<?>>()); MessageHandler target1 = new MessageStoringTestEndpoint(messages); MessageHandler target2 = new MessageStoringTestEndpoint(messages); dispatcher.addHandler(target1); dispatcher.addHandler(target2); dispatcher.dispatch(new GenericMessage<String>("test")); assertEquals(2, messages.size()); assertEquals(0, new IntegrationMessageHeaderAccessor(messages.get(0)).getSequenceNumber()); assertEquals(0, new IntegrationMessageHeaderAccessor(messages.get(0)).getSequenceSize()); assertEquals(0, new IntegrationMessageHeaderAccessor(messages.get(1)).getSequenceNumber()); assertEquals(0, new IntegrationMessageHeaderAccessor(messages.get(1)).getSequenceSize()); }
/** * Verifies that the dispatcher adds the message to the exception if it * was not attached by the handler. */ @Test public void testExceptionEnhancement() { dispatcher = new BroadcastingDispatcher(); dispatcher.addHandler(targetMock1); doThrow(new MessagingException("Mock Exception")) .when(targetMock1).handleMessage(eq(messageMock)); try { dispatcher.dispatch(messageMock); fail("Expected Exception"); } catch (MessagingException e) { assertEquals(messageMock, e.getFailedMessage()); } }
/** * Verifies that the dispatcher does not add the message to the exception if it * was attached by the handler. */ @Test public void testNoExceptionEnhancement() { dispatcher = new BroadcastingDispatcher(); dispatcher.addHandler(targetMock1); targetMock1.handleMessage(messageMock); Message<String> dontReplaceThisMessage = MessageBuilder.withPayload("x").build(); doThrow(new MessagingException(dontReplaceThisMessage, "Mock Exception")) .when(targetMock1).handleMessage(eq(messageMock)); try { dispatcher.dispatch(messageMock); fail("Expected Exception"); } catch (MessagingException e) { assertEquals(dontReplaceThisMessage, e.getFailedMessage()); } }
@Test public void applySequenceEnabled() { BroadcastingDispatcher dispatcher = new BroadcastingDispatcher(); dispatcher.setApplySequence(true); final List<Message<?>> messages = Collections.synchronizedList(new ArrayList<Message<?>>()); MessageHandler target1 = new MessageStoringTestEndpoint(messages); MessageHandler target2 = new MessageStoringTestEndpoint(messages); MessageHandler target3 = new MessageStoringTestEndpoint(messages); dispatcher.addHandler(target1); dispatcher.addHandler(target2); dispatcher.addHandler(target3); Message<?> inputMessage = new GenericMessage<String>("test"); Object originalId = inputMessage.getHeaders().getId(); dispatcher.dispatch(inputMessage); assertEquals(3, messages.size()); assertEquals(1, new IntegrationMessageHeaderAccessor(messages.get(0)).getSequenceNumber()); assertEquals(3, new IntegrationMessageHeaderAccessor(messages.get(0)).getSequenceSize()); assertEquals(originalId, new IntegrationMessageHeaderAccessor(messages.get(0)).getCorrelationId()); assertEquals(2, new IntegrationMessageHeaderAccessor(messages.get(1)).getSequenceNumber()); assertEquals(3, new IntegrationMessageHeaderAccessor(messages.get(1)).getSequenceSize()); assertEquals(originalId, new IntegrationMessageHeaderAccessor(messages.get(1)).getCorrelationId()); assertEquals(3, new IntegrationMessageHeaderAccessor(messages.get(2)).getSequenceNumber()); assertEquals(3, new IntegrationMessageHeaderAccessor(messages.get(2)).getSequenceSize()); assertEquals(originalId, new IntegrationMessageHeaderAccessor(messages.get(2)).getCorrelationId()); }
@Test public void defaultChannel() { PublishSubscribeChannel channel = this.context.getBean("defaultChannel", PublishSubscribeChannel.class); DirectFieldAccessor accessor = new DirectFieldAccessor(channel); BroadcastingDispatcher dispatcher = (BroadcastingDispatcher) accessor.getPropertyValue("dispatcher"); dispatcher.setApplySequence(true); dispatcher.addHandler(message -> { }); dispatcher.dispatch(new GenericMessage<>("foo")); DirectFieldAccessor dispatcherAccessor = new DirectFieldAccessor(dispatcher); assertNull(dispatcherAccessor.getPropertyValue("executor")); assertFalse((Boolean) dispatcherAccessor.getPropertyValue("ignoreFailures")); assertTrue((Boolean) dispatcherAccessor.getPropertyValue("applySequence")); Object mbf = this.context.getBean(IntegrationUtils.INTEGRATION_MESSAGE_BUILDER_FACTORY_BEAN_NAME); assertSame(mbf, dispatcherAccessor.getPropertyValue("messageBuilderFactory")); }