そのためには、MessageChannel
にはerrorChannel
というヘッダーを指定する必要があります。これは発信者のものとまったく同じです。 failedMessage.getHeaders().getErrorChannel()
との一部に
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);
}
ご注意:
ExecutorChannel
は、次のようなコードを持っている
MessagePublishingErrorHandler
に基づいています。
@MessagingGateway
のerrorChannel
オプションのすぐれたソリューションです。これはまったく同じerrorChannel
ヘッダーテクニックを使用し、その例外の範囲内で正確に例外を処理または再スローさせます。@MessagingGateway