[英]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- basicQos
与basicGet()
没有关系-仅与basicConsume()
。
Q3-完成后,您需要关闭连接。
最后; 这取决于。 如果您需要Spring的更高级别的支持(消息转换等),请使用它;否则,请使用它。 如果要处理原始数据API,请不要使用Spring。
RabbitTemplate
不直接通过用户管理的ack / nacks支持basicGet
,除非通过带有通道回调的execute
方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.