java - 如何在 Spring Integration Java DSL 中处理 ExecutorChannel 的错误 channel

标签 java spring-integration dsl

我想知道如何限制仅调用者处理 Spring Integration Java DSL 中执行器 channel 的错误。

例如 在我的用例中,我有一个队列(大小为 100 以限制输入)供调用者发送事件,轮询器将轮询队列并发送到 ExecutorChannel 进行异步处理(假设处理是 CPU 密集型的,我们将任务执行器的池大小限制为 2)。异步处理的结果将发送回调用者。另外,如果异步处理抛出异常。原始调用者将处理异常,而不是让全局错误处理程序来处理它。

我不知道如何指定一个 channel ,只有调用者才能看到从 ExecutorChannel 抛出的错误,并在 Spring Integration Java DSL 中以私有(private)方式处理它。

最佳答案

为此,您必须为某些 MessageChannel 指定 errorChannel header ,这完全取决于您的调用者。

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()部分。

适合您的开箱即用的良好解决方案是带有 errorChannel 选项的 @MessagingGateway。这个使用完全相同的 errorChannel header 技术,并让处理或重新抛出异常完全在该 @MessagingGateway 的范围内。

关于java - 如何在 Spring Integration Java DSL 中处理 ExecutorChannel 的错误 channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38958251/

相关文章:

java - Oracle 中的日期保存不适用于 ISO 8601 标准

java - 我正在尝试下载 JXTA 2.7

Java 和 Spring - 轮询 http 端点,直到服务器完成处理

java - 使用 XML 的 Spring Integration 与使用 Java DSL 的 Spring Integration 有什么区别?

java - 具有 Zookeper 服务器的集群环境中的 FTP 入站适配器

java - Mockito Java中的模拟继承方法

java - 测试 void 方法没有被 EasyMock 调用

clojure - 有没有人知道 DSL 设计的好引用?

java - Scanner 类的问题

python - 使用函数调用解析算术表达式