@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; }
protected Object resolveErrorChannel(final MessageHeaders requestHeaders) { Object errorChannel = requestHeaders.getErrorChannel(); if (errorChannel == null) { try { errorChannel = getChannelResolver().resolveDestination("errorChannel"); } catch (DestinationResolutionException e) { // ignore } } return errorChannel; }
private MessageChannel resolveErrorChannel(Throwable t) { if (t instanceof MessagingException) { Message<?> failedMessage = ((MessagingException) t).getFailedMessage(); if (failedMessage == null) { return null; } Object errorChannelHeader = failedMessage.getHeaders().getErrorChannel(); if (errorChannelHeader instanceof MessageChannel) { return (MessageChannel) errorChannelHeader; } else if (errorChannelHeader instanceof String) { return this.context.getBean((String) errorChannelHeader, MessageChannel.class); } else { throw new IllegalStateException("Unsupported error channel header type. " + "Expected MessageChannel or String, but actual header is [" + errorChannelHeader + "]"); } } else { return null; } }
@Nullable private MessageChannel resolveErrorChannel(Throwable t) { Throwable actualThrowable = t; if (t instanceof MessagingExceptionWrapper) { actualThrowable = t.getCause(); } Message<?> failedMessage = (actualThrowable instanceof MessagingException) ? ((MessagingException) actualThrowable).getFailedMessage() : null; if (getDefaultErrorChannel() == null && getChannelResolver() != null) { setChannel(getChannelResolver().resolveDestination(// NOSONAR not null IntegrationContextUtils.ERROR_CHANNEL_BEAN_NAME)); } if (failedMessage == null || failedMessage.getHeaders().getErrorChannel() == null) { return getDefaultErrorChannel(); } Object errorChannelHeader = failedMessage.getHeaders().getErrorChannel(); if (errorChannelHeader instanceof MessageChannel) { return (MessageChannel) errorChannelHeader; } Assert.isInstanceOf(String.class, errorChannelHeader, () -> "Unsupported error channel header type. Expected MessageChannel or String, but actual type is [" + errorChannelHeader.getClass() + "]"); // NOSONAR never null here if (getChannelResolver() != null) { return getChannelResolver().resolveDestination((String) errorChannelHeader); // NOSONAR not null } else { return null; } }
@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 errorChannel() { PollableChannel errorChannel = context.getBean("testErrorChannel", PollableChannel.class); MessageChannel inputChannel = context.getBean("errorChannelInput", MessageChannel.class); inputChannel.send(new GenericMessage<>("test")); Message<?> errorMessage = errorChannel.receive(10000); assertNotNull(errorMessage); Object errorPayload = errorMessage.getPayload(); assertEquals(MessageTransformationException.class, errorPayload.getClass()); Message<?> failedMessage = ((MessageTransformationException) errorPayload).getFailedMessage(); assertEquals("test", failedMessage.getPayload()); assertEquals(errorChannel, failedMessage.getHeaders().getErrorChannel()); }
@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; }
Object originalErrorChannelHeader = message.getHeaders().getErrorChannel();
@Test public void errorChannelRetained() { DirectChannel requestChannel = new DirectChannel(); DirectChannel errorChannel = new DirectChannel(); requestChannel.subscribe(new AbstractReplyProducingMessageHandler() { @Override protected Object handleRequestMessage(Message<?> requestMessage) { return requestMessage.getPayload() + "-reply"; } }); MessagingGatewaySupport gateway = new MessagingGatewaySupport() { }; gateway.setRequestChannel(requestChannel); gateway.setBeanFactory(mock(BeanFactory.class)); gateway.afterPropertiesSet(); Message<?> message = MessageBuilder.withPayload("test") .setErrorChannel(errorChannel).build(); Message<?> reply = gateway.sendAndReceiveMessage(message); assertEquals("test-reply", reply.getPayload()); assertEquals(errorChannel, reply.getHeaders().getErrorChannel()); }
@Test public void testFilterWithinHandler() { UUID correlationId = UUID.randomUUID(); QueueChannel replyChannel = new QueueChannel(); Message<String> message = MessageBuilder.withPayload("test") .setHeader("x", 1).setHeader("y", 2).setHeader("z", 3) .setCorrelationId(correlationId) .setReplyChannel(replyChannel) .setErrorChannelName("testErrorChannel") .build(); HeaderFilter filter = new HeaderFilter("x", "z"); MessageTransformingHandler handler = new MessageTransformingHandler(filter); handler.setBeanFactory(mock(BeanFactory.class)); handler.afterPropertiesSet(); handler.handleMessage(message); Message<?> result = replyChannel.receive(0); assertNotNull(result); assertNotNull(result.getHeaders().get("y")); assertNull(result.getHeaders().get("x")); assertNull(result.getHeaders().get("z")); assertEquals("testErrorChannel", result.getHeaders().getErrorChannel()); assertEquals(replyChannel, result.getHeaders().getReplyChannel()); assertEquals(correlationId, new IntegrationMessageHeaderAccessor(result).getCorrelationId()); }
protected Object resolveErrorChannel(final MessageHeaders requestHeaders) { Object errorChannel = requestHeaders.getErrorChannel(); if (errorChannel == null) { try { errorChannel = getChannelResolver().resolveDestination("errorChannel"); } catch (DestinationResolutionException e) { // ignore } } return errorChannel; }
@Nullable private MessageChannel resolveErrorChannel(Throwable t) { Throwable actualThrowable = t; if (t instanceof MessagingExceptionWrapper) { actualThrowable = t.getCause(); } Message<?> failedMessage = (actualThrowable instanceof MessagingException) ? ((MessagingException) actualThrowable).getFailedMessage() : null; if (getDefaultErrorChannel() == null && getChannelResolver() != null) { setChannel(getChannelResolver().resolveDestination(// NOSONAR not null IntegrationContextUtils.ERROR_CHANNEL_BEAN_NAME)); } if (failedMessage == null || failedMessage.getHeaders().getErrorChannel() == null) { return getDefaultErrorChannel(); } Object errorChannelHeader = failedMessage.getHeaders().getErrorChannel(); if (errorChannelHeader instanceof MessageChannel) { return (MessageChannel) errorChannelHeader; } Assert.isInstanceOf(String.class, errorChannelHeader, () -> "Unsupported error channel header type. Expected MessageChannel or String, but actual type is [" + errorChannelHeader.getClass() + "]"); // NOSONAR never null here if (getChannelResolver() != null) { return getChannelResolver().resolveDestination((String) errorChannelHeader); // NOSONAR not null } else { return null; } }
@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 @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; }
Object originalErrorChannelHeader = message.getHeaders().getErrorChannel();