繁体   English   中英

如何在Spring Integration Java DSL中处理ExecutorChannel的错误通道

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM