Nack当前消息和Ack当前消息之前的所有消息(rabbitmq,java)

时间:2017-07-03 06:19:27

标签: java rabbitmq spring-amqp

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条件的消息 如果当前消息符合条件,那么nack所有跳过的消息和ack当前消息 通过这样做,我想延迟处理一些特定的消息。

Q2。
我害怕如果我写的是(真的)并且有多个工作人员正在运行,那么channel.basicQos(1)将无法按预期工作。
我应该编写这样的代码来限制计数吗?或者我应该如何写以确保所有其他工作人员能够均匀地获得消息?

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

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

最后, RabbitMQ java客户端API与AmqpTemplate对比RabbitTemplate哪一个更适合这种情况(不使用MessageListener(ChannelAwareMessageListener)模型)?

1 个答案:

答案 0 :(得分:0)

Q1 - 它应该可以正常工作。你试过它并发现了问题吗?是的,每次交付时标签都会增加。

Q2 - basicQosbasicGet()无关 - 它仅与basicConsume()一起使用。

问题3 - 您需要在完成后关闭连接。

最后;这取决于。如果你想要Spring的更高级别的支持(消息转换等),那么就使用它;如果你想处理原始数据API,不要使用Spring。

RabbitTemplate不会直接支持basicGet用户管理的acks / nack,除非通过其execute方法进行频道回调。