@Override public void handleMessage(Message<?> message) throws MessagingException { MessageChannel replyChannel = (MessageChannel) message.getHeaders().getReplyChannel(); replyChannel.send(new GenericMessage<>("response")); } });
private MessageHandler createLateReplier(final CountDownLatch latch, final AtomicReference<Throwable> failure) { MessageHandler handler = message -> { try { Thread.sleep(500); MessageChannel replyChannel = (MessageChannel) message.getHeaders().getReplyChannel(); replyChannel.send(new GenericMessage<>("response")); failure.set(new IllegalStateException("Expected exception")); } catch (InterruptedException e) { failure.set(e); } catch (MessageDeliveryException ex) { String expected = "Reply message received but the receiving thread has exited due to a timeout"; String actual = ex.getMessage(); if (!expected.equals(actual)) { failure.set(new IllegalStateException( "Unexpected error: '" + actual + "'")); } } finally { latch.countDown(); } }; return handler; }
@Override @Nullable protected final Message<?> doSendAndReceive(MessageChannel channel, Message<?> requestMessage) { Assert.notNull(channel, "'channel' is required"); Object originalReplyChannelHeader = requestMessage.getHeaders().getReplyChannel(); Object originalErrorChannelHeader = requestMessage.getHeaders().getErrorChannel(); long sendTimeout = sendTimeout(requestMessage); long receiveTimeout = receiveTimeout(requestMessage); TemporaryReplyChannel tempReplyChannel = new TemporaryReplyChannel(this.throwExceptionOnLateReply); requestMessage = MessageBuilder.fromMessage(requestMessage).setReplyChannel(tempReplyChannel) .setHeader(this.sendTimeoutHeader, null) .setHeader(this.receiveTimeoutHeader, null) .setErrorChannel(tempReplyChannel).build(); try { doSend(channel, requestMessage, sendTimeout); } catch (RuntimeException ex) { tempReplyChannel.setSendFailed(true); throw ex; } Message<?> replyMessage = this.doReceive(tempReplyChannel, receiveTimeout); if (replyMessage != null) { replyMessage = MessageBuilder.fromMessage(replyMessage) .setHeader(MessageHeaders.REPLY_CHANNEL, originalReplyChannelHeader) .setHeader(MessageHeaders.ERROR_CHANNEL, originalErrorChannelHeader) .build(); } return replyMessage; }
@Override public void handleMessage(Message<?> message) { assertNull(message.getHeaders().get(MessageHistory.HEADER_NAME, MessageHistory.class)); MessageChannel replyChannel = (MessageChannel) message.getHeaders().getReplyChannel(); replyChannel.send(message); } });
private static void startResponder(final PollableChannel requestChannel) { new Thread(() -> { Message<?> input = requestChannel.receive(); GenericMessage<String> reply = new GenericMessage<>(input.getPayload() + "bar"); ((MessageChannel) input.getHeaders().getReplyChannel()).send(reply); }).start(); }
@Override public void handleMessage(Message<?> message) { Iterator<Properties> historyIterator = message.getHeaders() .get(MessageHistory.HEADER_NAME, MessageHistory.class).iterator(); assertTrue(historyIterator.hasNext()); MessageChannel replyChannel = (MessageChannel) message.getHeaders().getReplyChannel(); replyChannel.send(message); } });
private void startBackgroundReplier(final PollableChannel channel) { new SimpleAsyncTaskExecutor().execute(() -> { Message<?> request = channel.receive(50000); Message<?> reply = new GenericMessage<String>(((String) request.getPayload()).toUpperCase()); ((MessageChannel) request.getHeaders().getReplyChannel()).send(reply, 5000); }); }
@Override protected Object handleRequestMessage(Message<?> requestMessage) { assertThat(requestMessage.getHeaders().getReplyChannel(), Matchers.anyOf(instanceOf(String.class), Matchers.nullValue())); assertThat(requestMessage.getHeaders().getErrorChannel(), Matchers.anyOf(instanceOf(String.class), Matchers.nullValue())); if (requestMessage.getPayload().equals("bar")) { throw new RuntimeException("intentional"); } return MessageBuilder.withPayload("echo:" + requestMessage.getPayload()) .setHeader("stringReplyChannel", requestMessage.getHeaders().getReplyChannel()) .build(); }
@Test public void sendObjectAndReceiveMessage() { Mockito.when(messageMock.getPayload()).thenReturn("foo"); Mockito.when(replyChannel.receive(100L)).thenReturn(messageMock); Mockito.doAnswer(invocation -> { Message<?> message = (Message<?>) invocation.getArguments()[0]; MessageChannel replyChannel = (MessageChannel) message.getHeaders().getReplyChannel(); replyChannel.send(messageMock); return true; }).when(requestChannel).send(Mockito.any(Message.class), Mockito.anyLong()); this.messagingGateway.setReplyTimeout(100L); Message<?> receiveMessage = this.messagingGateway.sendAndReceiveMessage("test"); assertSame(messageMock, receiveMessage); }
@Test //INT-2316 public void replyChannelName() { PollableChannel replyChannel = context.getBean("testReplyChannel", PollableChannel.class); MessageChannel inputChannel = context.getBean("replyChannelNameInput", MessageChannel.class); inputChannel.send(new GenericMessage<>("test")); Message<?> result = replyChannel.receive(10000); assertNotNull(result); assertEquals("TEST", result.getPayload()); assertEquals("testReplyChannel", result.getHeaders().getReplyChannel()); }
@Test //INT-2316 public void replyChannelExpression() { PollableChannel replyChannel = context.getBean("testReplyChannel", PollableChannel.class); MessageChannel inputChannel = context.getBean("replyChannelExpressionInput", MessageChannel.class); inputChannel.send(new GenericMessage<>("test")); Message<?> result = replyChannel.receive(10000); assertNotNull(result); assertEquals("TEST", result.getPayload()); assertEquals(replyChannel, result.getHeaders().getReplyChannel()); }
private MessageHandler echoInboundStringHandler() { return message -> { assertTrue(message.getPayload() instanceof String); MessagingTemplate template = new MessagingTemplate(); template.setDefaultDestination((MessageChannel) message.getHeaders().getReplyChannel()); template.send(message); }; }
@Test public void replyChannel() { PollableChannel replyChannel = context.getBean("testReplyChannel", PollableChannel.class); MessageChannel inputChannel = context.getBean("replyChannelInput", MessageChannel.class); inputChannel.send(new GenericMessage<>("test")); Message<?> result = replyChannel.receive(10000); assertNotNull(result); assertEquals("TEST", result.getPayload()); assertEquals(replyChannel, result.getHeaders().getReplyChannel()); }
@Test public void replyChannelDefaultOverwriteFalseButNoExistingHeader() { MessageChannel inputChannel = this.context.getBean( "replyChannelDefaultOverwriteFalseButNoExistingHeaderInput", MessageChannel.class); PollableChannel replyChannel = this.context.getBean( "replyChannelDefaultOverwriteFalseButNoExistingHeaderOutput", PollableChannel.class); Message<?> message = MessageBuilder.withPayload("test").build(); inputChannel.send(message); Message<?> result = replyChannel.receive(0); assertNotNull(result); assertEquals("TEST", result.getPayload()); assertEquals(replyChannel, result.getHeaders().getReplyChannel()); }
@Test public void replyChannelDefaultOverwriteFalse() { MessageChannel inputChannel = this.context.getBean("replyChannelDefaultOverwriteFalseInput", MessageChannel.class); QueueChannel replyChannel = new QueueChannel(); Message<?> message = MessageBuilder.withPayload("test").setReplyChannel(replyChannel).build(); inputChannel.send(message); Message<?> result = replyChannel.receive(0); assertNotNull(result); assertEquals("TEST", result.getPayload()); assertEquals(replyChannel, result.getHeaders().getReplyChannel()); }
@Test public void replyChannelExplicitOverwriteFalse() { MessageChannel inputChannel = this.context.getBean("replyChannelExplicitOverwriteFalseInput", MessageChannel.class); QueueChannel replyChannel = new QueueChannel(); Message<?> message = MessageBuilder.withPayload("test").setReplyChannel(replyChannel).build(); inputChannel.send(message); Message<?> result = replyChannel.receive(0); assertNotNull(result); assertEquals("TEST", result.getPayload()); assertEquals(replyChannel, result.getHeaders().getReplyChannel()); }
@Test public void replyChannelDefaultOverwriteTrueButExplicitOverwriteFalse() { MessageChannel inputChannel = this.context.getBean("replyChannelDefaultOverwriteTrueButExplicitOverwriteFalseInput", MessageChannel.class); QueueChannel replyChannel = new QueueChannel(); Message<?> message = MessageBuilder.withPayload("test").setReplyChannel(replyChannel).build(); inputChannel.send(message); Message<?> result = replyChannel.receive(0); assertNotNull(result); assertEquals("TEST", result.getPayload()); assertEquals(replyChannel, result.getHeaders().getReplyChannel()); }
@Test public void replyChannelExplicitOverwriteTrue() { MessageChannel inputChannel = this.context.getBean("replyChannelExplicitOverwriteTrueInput", MessageChannel.class); PollableChannel replyChannel = this.context.getBean("replyChannelExplicitOverwriteTrueOutput", PollableChannel.class); QueueChannel replyChannelToOverwrite = new QueueChannel(); Message<?> message = MessageBuilder.withPayload("test").setReplyChannel(replyChannelToOverwrite).build(); inputChannel.send(message); Message<?> result = replyChannel.receive(0); assertNotNull(result); assertEquals("TEST", result.getPayload()); assertEquals(replyChannel, result.getHeaders().getReplyChannel()); assertNull(replyChannelToOverwrite.receive(0)); }
@Test public void replyChannelDefaultOverwriteTrue() { MessageChannel inputChannel = this.context.getBean("replyChannelDefaultOverwriteTrueInput", MessageChannel.class); PollableChannel replyChannel = this.context.getBean("replyChannelDefaultOverwriteTrueOutput", PollableChannel.class); QueueChannel replyChannelToOverwrite = new QueueChannel(); Message<?> message = MessageBuilder.withPayload("test").setReplyChannel(replyChannelToOverwrite).build(); inputChannel.send(message); Message<?> result = replyChannel.receive(0); assertNotNull(result); assertEquals("TEST", result.getPayload()); assertEquals(replyChannel, result.getHeaders().getReplyChannel()); assertNull(replyChannelToOverwrite.receive(0)); }
@Test public void replyChannelExplicitOverwriteTrue() { MessageChannel inputChannel = context.getBean("input", MessageChannel.class); QueueChannel replyChannel = new QueueChannel(); Message<?> message = MessageBuilder.withPayload("test").setReplyChannel(replyChannel).build(); inputChannel.send(message); Message<?> result = replyChannel.receive(0); assertNotNull(result); assertEquals("test", result.getPayload()); assertEquals(replyChannel, result.getHeaders().getReplyChannel()); assertEquals(123, result.getHeaders().get("foo")); assertEquals("ABC", result.getHeaders().get("bar")); assertEquals("zzz", result.getHeaders().get("other")); }