为此目的,您必须指定errorChannel
标头,其中MessageChannel
与您的调用者完全相同。
的ExecutorChannel
是基于其具有类似的代码MessagePublishingErrorHandler
:
private MessageChannel resolveErrorChannel(Throwable t) {
Message<?> failedMessage = (t instanceof MessagingException) ?
((MessagingException) t).getFailedMessage() : null;
if (this.defaultErrorChannel == null && this.channelResolver != null) {
this.defaultErrorChannel = this.channelResolver.resolveDestination(
IntegrationContextUtils.ERROR_CHANNEL_BEAN_NAME);
}
if (failedMessage == null || failedMessage.getHeaders().getErrorChannel() == null) {
return this.defaultErrorChannel;
}
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() + "]");
return this.channelResolver.resolveDestination((String) errorChannelHeader);
}
注重与failedMessage.getHeaders().getErrorChannel()
的一部分。
您的开箱即用解决方案是@MessagingGateway
和errorChannel
选件。这个使用完全相同的errorChannel
标题技术,让我们处理或重新抛出异常,恰好在@MessagingGateway
的范围内。