弹簧集成amqp拒绝消息,如果没有获得

时间:2015-07-09 14:24:37

标签: spring-integration amqp

我需要解决这个问题。我有两个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但只允许一次消耗一条消息,因此不进行并行处理。 如果另一条消息花了太长时间才能继续,如何在超时后拒绝一条消息。 所以此消息将返回队列以继续另一个节点?我只是说这两个消费者预取两条消息,但只有一条可以一次处理,所以如果第一条消息需要很长时间才能继续,那么如何释放第二条预取消息。

1 个答案:

答案 0 :(得分:1)

你的问题不明确。您可以在队列通道上设置容量限制(例如1),并在网关上设置sendTimeout。然后,如果队列已满,则在超时后尝试添加消息将失败。但是,在此方案中使用队列通道是危险的 - 如果服务器发生故障,您可能会丢失消息,因为消息一旦存入队列就会被激活。

如果您使用RendezvousChannel,生产者将阻止等待消费者接收消息。

但请记住,如果服务器在切换后崩溃,即使这条消息也会丢失。