[英]How to handle error channel for ExecutorChannel in Spring Integration Java DSL
我想知道如何限制调用程序处理Spring Integration Java DSL中执行程序通道的错误。
例如,在我的用例中,我有一个queue
(大小为100来限制输入)以便调用者发送事件,轮询器将轮询队列并发送到ExecutorChannel
进行异步处理(假设处理是CPU密集型的,我们将任务执行程序的池大小限制为2)。 异步处理的结果将发送回调用者。 此外,如果异步处理存在异常抛出。 原始调用者将处理异常,而不是让全局错误处理程序来处理它。
我不知道如何指定一个通道,只有调用者才能看到ExecutorChannel
抛出的错误,并在Spring Integration Java DSL中以私有方式处理它。
为此,您必须为某些MessageChannel
指定errorChannel
标头,该标头完全取决于您的调用方。
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
。 这个使用完全相同的errorChannel
头技术,让我们只在@MessagingGateway
的范围内处理或重新抛出异常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.