执行器通道和直接通道之间的差异 - 直接通道在失败时将消息加倍,但执行器通道在相同情况下不会加倍

问题描述 投票:0回答:1

我正在尝试使用 Spring Integration 框架查找 java 应用程序中 Executor Channel 和 Direct Channel 之间行为不同的原因。

我想检查故障转移流程并确保消息不会重复 - 对于这两种情况 JmsOutboundGateway -> secondaryGateway 将始终抛出错误。

第一个场景

inputLocalChannel - Executor Channel
inputGateway - Direct Channel
inputGatewayBck - Direct Channel ( secondGateway - failing flow )

我不知道为什么,但消息是重复的 - 我只发送了 3 条消息,但响应队列中有 6 条消息

第二种情况

inputLocalChannel - Executor Channel
inputGateway - Executor Channel
inputGatewayBck - Executor Channel ( secondGateway - failing flow )

在本例中,我发送了 3 条消息并收到 3 条消息 - 这符合预期。

@MessagingGateway(name = "LocalGateway")
public interface LocalGateway {

    @Gateway(requestChannel = "inputLocalChannel")
    ListenableFuture<Message<String>> sendMsg(Message<String> request);

}

@Bean
    @ServiceActivator(inputChannel = "inputLocalChannel")
    public Message<String>firstHandler(){
    // some code
}

@Bean
    @ServiceActivator(inputChannel = "inputLocalChannel")
    public Message<String> secondHandler(){
    // some code
}


@Bean
    @ServiceActivator(inputChannel = "inputGateway")
    public JmsOutboundGateway firstGateway(){
    // some code
}

@Bean
    @ServiceActivator(inputChannel = "inputGatewayBck")
    public JmsOutboundGateway secondGateway(){
    // some code
}

是否有可能在通道流中使用相同的线程 输入本地通道 -> 输入网关 inputLocalChannel -> inputGatewayBck

无需上下文切换? 为什么在使用直接渠道的情况下这些消息会重复?

java spring spring-integration
1个回答
0
投票

DirectChannel
默认带有循环策略。 因此,由于您有两个订阅者
inputLocalChannel
,您最终会遇到这样的情况:第一条消息由第一个订阅者处理,第二条消息由第二条订阅者处理,依此类推,每条消息的订阅者之间循环。

现在关于错误。该通道默认使用

UnicastingDispatcher
failover = true
。逻辑是这样的:如果当前
MessageHandler
失败,则将相同的消息交给下一个订阅者。

不确定这是否符合预期,但您可能更愿意将

LoadBalancingStrategy
设置为该通道中的 null,这样就不会发生循环,但
MessageHandler
中的错误故障转移仍会进行。

ExecutorChannel
的区别在于
inputGateway
该通道的订阅者中发生的异常不会向上传给调用者。因此,故障转移无法知道它必须迭代到下一个订阅者。只是因为所有的事情都发生在不同的线程上,因此错误处理必须以不同的方式进行:https://docs.spring.io/spring-integration/reference/error-handling.html

© www.soinside.com 2019 - 2024. All rights reserved.