我需要知道此消费者是否还有更多消息。
现在,我对队列中的消息进行计数。但这只给了我队列中剩下的,而不是预取的。
@RabbitListener(queues = QUEUENAME)
public void recieve(Message message, Channel channel) throws IOException {
long messagesOnQueue = channel.messageCount(QUEUENAME);
if(messagesOnQueue>1) {
//add message to list
}
else {
//save the list
}
}
如果有一种方法可以确定是否已为此用户预取消息,那将非常好。那可能吗?如果我可以得到该计数,那么我也不在乎队列中是否还有消息。
在收到Gary的建议后,我将实现更改为此实现,并且它可以正常工作。 手动确认消息时,必须在收到消息的同一通道上完成。但是,如果在另一个线程中需要它,则可以保存对它的引用。 在您的spring boot application.yml中添加此
spring:
rabbitmq:
listener:
direct:
prefetch: 200
simple:
prefetch: 200
acknowledgeMode: MANUAL
来自消费者的代码。
//The list we build and save in one transaction
private Set<PayloadDto> unhandledPayloads = new HashSet<>();
private long latestTag = 0L;
private Channel latestChannel;
@RabbitListener(queues = QUEUE_NAME, id = "consumerId")
public void recieve(Message message, Channel channel) throws IOException {
PayloadDto payloadDto = parse(message.getBody());
unhandledPayloads.add(payloadDto);
latestTag = message.getMessageProperties().getDeliveryTag();
latestChannel = channel;
if (unhandledPayloads.size() > UNHANDLED_PAYLOADS_LIMIT) {
service.createOrUpdate(unhandledPayloads);
queue.clear();
channel.basicAck(latestTag, true);
}
}
@EventListener(condition = "event.listenerId == 'consumerId'")
public void onApplicationEvent(ListenerContainerIdleEvent event) {
if(!queue.isEmpty()) {
service.createOrUpdate(unhandledPayloads);
queue.clear();
latestChannel.basicAck(latestTag, true);
}
}
我们要在保存列表之前先建立列表的原因是为了能够批量插入,以使其运行更快。
答案 0 :(得分:1)
目前不是,但是添加功能并不困难。打开一个github问题来请求它。但是,我不确定它是否有用。如果队列中仍然有消息,则使用预提取的消息将提取另一个消息。