爲此目的,您必須指定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
的範圍內。