Spring integration 带错误通道的Spring集成异步网关导致线程停止

Spring integration 带错误通道的Spring集成异步网关导致线程停止,spring-integration,asynchronous,Spring Integration,Asynchronous,我有一个异步网关,其中定义了一个异步执行器和一个错误通道。还有一个处理异常的服务激活器 <int:gateway id="myGateway" service-interface="me.myGateway" default-request-channel="requestChannel" async-executor="taskScheduler" error-channel="err

我有一个异步网关,其中定义了一个异步执行器和一个错误通道。还有一个处理异常的服务激活器

<int:gateway id="myGateway"
             service-interface="me.myGateway"
             default-request-channel="requestChannel"
             async-executor="taskScheduler"
             error-channel="errorChannel"/>

<int:service-activator ref="errorChannelMessageHandler" method="handleFailedInvocation"
                       input-channel="errorChannel"/>

公共接口MyGateway{
未来发送(消息);
}
@组成部分
公共类ErrorChannelMessageHandler{
@服务激活器
公共对象handleFailedNotification(MessaginException异常){
//在这里做些事情
返回null;
}
}
当抛出异常时,线程阻塞,等待网关创建的临时回复通道上的回复

如何防止线程阻塞,以及在抛出异常时让错误通道服务激活器处理消息并执行一些自定义逻辑

稍后编辑: 我使用的是SI 3.0.3.0版本
当为网关定义错误通道时,如果发生异常,它将调用此行(MessagingGatewaySupport中的no 250)errorFlowReply=this.messagingTemplate.sendAndReceive(this.errorChannel,errorMessage),这将在新创建的临时回复通道(messagingTemplate中的第352-367行)上执行阻塞接收。错误通道的“我的服务激活器”是否负责在这个新创建的临时通道上发布消息,以便线程不会在接收时阻塞?

删除错误通道,以便将原始异常添加到未来的
中,以便
get()
将其传播


如果要在错误流上执行某些操作,请从错误流中抛出异常,以便在
将来
中可用,或将
回复超时
设置为0。但是,在这种情况下,您的未来将永远不会得到值或异常。

长话短说:我的SI链连接到RabbitMQ并发布消息。兔子连接关闭时,将抛出AmqpConnectException。在这种情况下,我想做的是获取消息并将它们保存到某个地方(db,本地文件)。这就是错误通道可用的地方,因为在服务激活器中,我将执行此操作。如果我删除了错误通道,我该怎么做?未来的get()可能并不总是被调用,因为有时我需要答案,有时我只是执行fire-and-forget。还有一个问题:如果我删除了错误通道,那么如果我不能正确使用它,那么为网关设置此属性有什么意义?或者我在这里遗漏了什么。感谢您可以使用错误通道,但错误流必须返回结果或引发异常(或者如我所说,将
回复超时设置为0)。它不会影响“良好”流,除非您有进一步的异步切换-回复超时仅在线程返回网关时开始。MessagingTemplate仍将创建临时回复通道,并将在接收中阻塞。如果没有回复超时,我看不出这将如何工作。错误流如何返回结果或引发异常?这如何<代码>@Component公共类ErrorChannelMessageHandler{@ServiceActivator public void HandleFailedNotification(消息消息消息){//持久化消息。getPayload().getFailedMessage();MessageChannel replyChannel=(MessageChannel)消息。getHeaders().get(“replyChannel”);CustomResponse CustomResponse=new CustomResponse(…);replyChannel.send(MessageBuilder.withPayload(CustomResponse.build());}}
我向网关发送响应,未来将始终返回响应,我可以自定义响应
public interface MyGateway {
    Future<Object> send(Message message);
}

@Component
public class ErrorChannelMessageHandler {
    @ServiceActivator
    public Object handleFailedInvocation(MessagingException exception) {
        // do some stuff here
        return null;
    }
}