【问题标题】:Spring AMQP and messages in queueSpring AMQP 和队列中的消息
【发布时间】:2017-09-04 07:01:26
【问题描述】:

在 Spring AMQP 项目中,我想在 RabbitMQ 中实时获取某个队列中的消息数量(根据该消息数量做出决定)(我无法使用管理插件)。 基本配置是这样的:

@Bean(name="managementServerHandler")
    public ManagementServerHandler managementServerHandler(){
        return new ManagementServerHandler();
    }
    @Bean 
    public MessageListenerAdapter broadcastManagementServerHandler() {
        return new MessageListenerAdapter(managementServerHandler(), "handleMessage");
    }
    @Bean(name="broadcastManagementMessageListenerContainer") 
    public SimpleMessageListenerContainer broadcastManagementMessageListenerContainer() 
    {
        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(_connectionFactory());
        container.setQueueNames( REQUEST_MANAGEMENT_QUEUE );
        container.setMessageListener(broadcastManagementServerHandler());
        container.setAcknowledgeMode(AcknowledgeMode.AUTO);
        container.setAutoDeclare(true);
        container.setAutoStartup(true);
        container.setConcurrentConsumers(1);
        container.setRabbitAdmin((RabbitAdmin)_amqpAdmin());
        container.setPrefetchCount(50);

        container.setDeclarationRetries(3);
        container.setMissingQueuesFatal(true);
        container.setFailedDeclarationRetryInterval(1000);
        container.setRecoveryInterval(400);

        return container;
    }

“ManagementServerHandler”所在的位置:

 public class ManagementServerHandler implements ServletContextAware, MessageListener
    {
     @Override
        public void onMessage(Message msg) 
        {....}
}

我需要 onMessage 方法中的排队消息数,但我找不到方法。 我问了这个问题,但是不知道怎么获取AMQP通道:

RabbitMQ and queue data

谢谢!

【问题讨论】:

  • 有关更多信息,我需要来自另一个队列的消息数,而不是来自容器正在侦听的队列的消息数。我已经用“channel.messageCount (your_queue)”试过了,但它总是返回零。

标签: spring-amqp


【解决方案1】:

使用RabbitAdmin.getQueueProperties(queue)

/**
 * Returns 3 properties {@link #QUEUE_NAME}, {@link #QUEUE_MESSAGE_COUNT},
 * {@link #QUEUE_CONSUMER_COUNT}, or null if the queue doesn't exist.
 */
@Override
public Properties getQueueProperties(final String queueName) {

【讨论】:

  • 谢谢你,加里。我已经尝试过了,但它总是返回我的消息数 0。消费者的数量和队列的名称确实返回它,但不是消息的数量:{“QUEUE_CONSUMER_COUNT”:1,“QUEUE_MESSAGE_COUNT”:0 ,"QUEUE_NAME":"myRequestQueueue.8656"}
  • 也许你的消费者有一个大的预取? (basicQos)。计数(和channel.messageCount())仅包括ready 消息。如果已经发送给消费者,则不计算在内;换句话说,计数不包括unacked 消息。
  • 谢谢加里,原来如此。我有一个价值 5 的“预取计数”。我想这不合适。有没有办法得到消息的总数(准备好的和未确认的)?
  • 不使用AMQP协议;仅通过管理插件实现 REST。
  • 谢谢 Gary,REST 是我使用的第一个选项,但该插件中的信息每五秒更新一次,所以我必须想一个替代方案。再次感谢您!