我正在尝试使用 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
无需上下文切换? 为什么在使用直接渠道的情况下这些消息会重复?
DirectChannel
默认带有循环策略。
因此,由于您有两个订阅者 inputLocalChannel
,您最终会遇到这样的情况:第一条消息由第一个订阅者处理,第二条消息由第二条订阅者处理,依此类推,每条消息的订阅者之间循环。
现在关于错误。该通道默认使用
UnicastingDispatcher
和 failover = true
。逻辑是这样的:如果当前 MessageHandler
失败,则将相同的消息交给下一个订阅者。
不确定这是否符合预期,但您可能更愿意将
LoadBalancingStrategy
设置为该通道中的 null,这样就不会发生循环,但 MessageHandler
中的错误故障转移仍会进行。
与
ExecutorChannel
的区别在于 inputGateway
该通道的订阅者中发生的异常不会向上传给调用者。因此,故障转移无法知道它必须迭代到下一个订阅者。只是因为所有的事情都发生在不同的线程上,因此错误处理必须以不同的方式进行:https://docs.spring.io/spring-integration/reference/error-handling.html