我需要解决这个问题。我有两个amqp使用者设置来获取一条消息。
@Bean
public IntegrationFlow jmsPrimaryFlow() {
return IntegrationFlows.from(
Amqp.inboundGateway(
taskManager().getPrimaryMessageListenerContainer()).errorChannel(errorChannel())
)
.channel(taskChannel())
.get();
}
@Bean
public IntegrationFlow jmsSecondaryFlow() {
return IntegrationFlows.from(
Amqp.inboundGateway(
taskManager().getSecondaryMessageListenerContainer()).errorChannel(errorChannel())
.autoStartup(false)
)
.channel(taskChannel())
.get();
}
taskChannel是queuechannel但只允许一次消耗一条消息,因此不进行并行处理。 如果另一条消息花了太长时间才能继续,如何在超时后拒绝一条消息。 所以此消息将返回队列以继续另一个节点?我只是说这两个消费者预取两条消息,但只有一条可以一次处理,所以如果第一条消息需要很长时间才能继续,那么如何释放第二条预取消息。
答案 0 :(得分:1)
你的问题不明确。您可以在队列通道上设置容量限制(例如1),并在网关上设置sendTimeout。然后,如果队列已满,则在超时后尝试添加消息将失败。但是,在此方案中使用队列通道是危险的 - 如果服务器发生故障,您可能会丢失消息,因为消息一旦存入队列就会被激活。
如果您使用RendezvousChannel
,生产者将阻止等待消费者接收消息。
但请记住,如果服务器在切换后崩溃,即使这条消息也会丢失。