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)模型)?
答案 0 :(得分:0)
Q1 - 它应该可以正常工作。你试过它并发现了问题吗?是的,每次交付时标签都会增加。
Q2 - basicQos
与basicGet()
无关 - 它仅与basicConsume()
一起使用。
问题3 - 您需要在完成后关闭连接。
最后;这取决于。如果你想要Spring的更高级别的支持(消息转换等),那么就使用它;如果你想处理原始数据API,不要使用Spring。
RabbitTemplate
不会直接支持basicGet
用户管理的acks / nack,除非通过其execute
方法进行频道回调。