繁体   English   中英

在当前消息之前确认所有消息,并在Ack当前消息之前确认所有消息(rabbitmq,java)

[英]Nack all messages before current message and Ack current message (rabbitmq, java)

channel.basicQos(1);

while (true) {
    GetResponse res = channel.basicGet(TEST_QUEUE, false);
    if (res != null) {
        deliveryTag = res.getEnvelope().getDeliveryTag();
    }

    // Handle all messages If the condition is true
    if (condition) {
        // nack all messages unhandled previously
        channel.basicNack(deliveryTag - 1, true, true);

        // ack current message only
        channel.basicAck(deliveryTag, false);
    }
    else {
        // Do not handle current message and continue to get next one
    }           
}   

Q1。
我不确定是否可以同时使用nack和ack。
我可以使用deliveryTag-1指示所有以前的消息吗?

简而言之,我想跳过所有不满足if条件的消息。
如果当前消息满足条件,则取消所有跳过的消息并确认当前一个。
通过这样做,我想延迟处理某些特定的消息。

Q2。
恐怕如果我将while(true)编写为true并且有多个工作程序正在运行,则channel.basicQos(1)将无法按预期工作。
我应该编写这样的代码来限制数量吗? 或应该如何写以确保所有其他工作人员都能均匀地收到消息?

int prefetch = 1;
int count = 0;
while (count++ <= prefetch) {
}

Q3。
我注意到只要打开连接,辅助程序就不会终止。
连接将打开多长时间,我是否需要手动关闭它?

最后,RabbitMQ Java客户端API vs AmqpTemplate vs RabbitTemplate在这种情况下哪个更合适(不使用MessageListener(ChannelAwareMessageListener)模型)?

Q1-应该可以。 您是否尝试过并发现问题? 是的,标签在每次交付时都会递增。

Q2- basicQosbasicGet()没有关系-仅与basicConsume()

Q3-完成后,您需要关闭连接。

最后; 这取决于。 如果您需要Spring的更高级别的支持(消息转换等),请使用它;否则,请使用它。 如果要处理原始数据API,请不要使用Spring。

RabbitTemplate不直接通过用户管理的ack / nacks支持basicGet ,除非通过带有通道回调的execute方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM