Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring集成javadsl中ExecutorChannel的错误通道处理_Java_Spring Integration_Dsl - Fatal编程技术网

Spring集成javadsl中ExecutorChannel的错误通道处理

Spring集成javadsl中ExecutorChannel的错误通道处理,java,spring-integration,dsl,Java,Spring Integration,Dsl,我想知道如何在SpringIntegrationJavaDSL中仅限制调用方处理executor通道的错误 e、 g。 在我的用例中,我有一个队列(大小为100以限制输入)供调用方发送事件,轮询器将轮询队列并发送到执行器通道,以进行异步处理(假设处理是CPU密集型的,并且我们将任务执行器的池大小限制为2)。异步处理的结果将发送回调用方。此外,如果存在异步处理的异常抛出。原始调用方将处理异常,而不是让全局错误处理程序来处理它 我不知道如何指定一个只有调用者才能看到从ExecutorChannel抛

我想知道如何在SpringIntegrationJavaDSL中仅限制调用方处理executor通道的错误

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


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

为此,您必须为一些
MessageChannel
指定
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);
}
private MessageChannel resolveErrorChannel(可丢弃的t){
Message failedMessage=(消息异常的t实例)?
((MessaginException)t).getFailedMessage():null;
if(this.defaultErrorChannel==null&&this.channelResolver!=null){
this.defaultErrorChannel=this.channelResolver.resolveDestination(
IntegrationContextUtils.ERROR\u CHANNEL\u BEAN\u NAME);
}
if(failedMessage==null | | failedMessage.getHeaders().getErrorChannel()==null){
返回此.defaultErrorChannel;
}
Object errorChannelHeader=failedMessage.getHeaders().getErrorChannel();
if(errorChannelHeader instanceof MessageChannel){
返回(MessageChannel)errorChannelHeader;
}
Assert.isInstanceOf(String.class,errorChannelHeader,
不受支持的错误通道头类型。应为MessageChannel或String,但实际类型为[]+
errorChannelHeader.getClass();
返回此.channelResolver.resolveDestination((字符串)errorChannelHeader);
}
请注意带有
failedMessage.getHeaders().getErrorChannel()
的部分


适合您的现成解决方案是
@MessagingGateway
,带有
errorChannel
选项。这一个使用完全相同的
errorChannel
头技术,让处理或重新抛出异常正好在
@MessagingGateway

的范围内。为此,您必须为某些
消息通道
指定
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);
}
private MessageChannel resolveErrorChannel(可丢弃的t){
Message failedMessage=(消息异常的t实例)?
((MessaginException)t).getFailedMessage():null;
if(this.defaultErrorChannel==null&&this.channelResolver!=null){
this.defaultErrorChannel=this.channelResolver.resolveDestination(
IntegrationContextUtils.ERROR\u CHANNEL\u BEAN\u NAME);
}
if(failedMessage==null | | failedMessage.getHeaders().getErrorChannel()==null){
返回此.defaultErrorChannel;
}
Object errorChannelHeader=failedMessage.getHeaders().getErrorChannel();
if(errorChannelHeader instanceof MessageChannel){
返回(MessageChannel)errorChannelHeader;
}
Assert.isInstanceOf(String.class,errorChannelHeader,
不受支持的错误通道头类型。应为MessageChannel或String,但实际类型为[]+
errorChannelHeader.getClass();
返回此.channelResolver.resolveDestination((字符串)errorChannelHeader);
}
请注意带有
failedMessage.getHeaders().getErrorChannel()
的部分

适合您的现成解决方案是
@MessagingGateway
,带有
errorChannel
选项。这一个使用了完全相同的
errorChannel
头技术,并允许在该
@MessagingGateway
的范围内处理或重新抛出异常