rabbitmq查看队列中消息数量的方法

本文详细介绍如何在Spring框架中配置RabbitMQ连接服务,并提供一个实用的工具类用于监控RabbitMQ的消息队列,包括查询队列中的消息数量。
  1. 配置rabbitmq
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	   xmlns:rabbit="http://www.springframework.org/schema/rabbit"
	   xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/rabbit
    http://www.springframework.org/schema/rabbit/spring-rabbit.xsd" >

	<description>rabbitmq 连接服务配置</description>

	<!-- 连接配置 publisherConfirms 发布的消息是否确定-->
	<bean id="rabbitMqConnectionFactory"
		  class="org.springframework.amqp.rabbit.connection.CachingConnectionFactory">
		<property name="addresses" value="${rabbitmq.addresses}"/>
		<property name="username" value="${rabbitmq.username}"/>
		<property name="password" value="${rabbitmq.password}"/>
		<property name="virtualHost" value="${rabbitmq.vhost}"/>
		<property name="channelCacheSize" value="${rabbitmq.channelCacheSize}"/>
	</bean>


	<!-- spring template声明 -->
	<rabbit:template id="amqpTemplate" connection-factory="rabbitMqConnectionFactory"
	/>


</beans>
  1. 工具类实现
/**
 * 监控rabbitmq的工具类
 */
@Slf4j
public class RabbitMqUtil{
    private static RabbitTemplate amqpTemplate;

    /**
     * 初始化amqpTemplate
     */
    static {
        amqpTemplate = SpringContextUtil.getBean(RabbitTemplate.class);
        Assert.notNull(amqpTemplate,"获取不到amqpTemplate");
    }

    /**
     * 查询队列中的消息数量
     * @param exchange 交换机名字
     * @param exchangeType 交换机类型 fanout 或 direct
     * @param quene 队列名字
     * @return
     */
    public static BaseResultDTO getMessageCount(String exchange, String exchangeType, String quene) {
        Assert.hasText(exchange,"exchange不能为空");
        Assert.hasText(quene,"队列名不能为空");
        Assert.hasText(exchangeType,"exchangeType不能为空");
        checkInitSuccess();


        BaseResultDTO baseResultDTO = new BaseResultDTO();
        ConnectionFactory connectionFactory = amqpTemplate.getConnectionFactory();
        // 创建连接
        Connection connection = connectionFactory.createConnection();
        // 创建通道
        Channel channel = connection.createChannel(false);
        // 设置消息交换机
        try {
            channel.exchangeDeclare(exchange, exchangeType, true, false, null);
            AMQP.Queue.DeclareOk declareOk = channel.queueDeclarePassive(quene);
            //获取队列中的消息个数
            Integer queueCount = declareOk.getMessageCount();
            // 关闭通道和连接
            channel.close();
            connection.close();

            baseResultDTO.setSuccess(true);
            baseResultDTO.setMessage(queueCount.toString());
        } catch (IOException e) {
            LoggerFormatUtil.warn(e,log,"连接rabbitmq异常");
        }


        return baseResultDTO;
    }


    /**
     * 校验amqpTemplate是否已经实例化
     * @return
     */
    private static void checkInitSuccess(){
        if (null == amqpTemplate){
            amqpTemplate = SpringContextUtil.getBean(RabbitTemplate.class);
        }
        Assert.notNull(amqpTemplate, "amqpTemplate 实例化异常");
    }
}

  1. spring辅助工具类获取bean
@Component
public class SpringContextUtil implements ApplicationContextAware {
    public static ApplicationContext applicationContext = null;

    public SpringContextUtil() {
    }

    @SuppressWarnings("unchecked")
	public static <T> T getBean(String beanName, Class<T> beanType) {
        Assert.isTrue(applicationContext != null, "应用上下文不能为空");
        Object bean = applicationContext.getBean(beanName);
        return bean == null ? null : (T)bean;
    }

    /**
     * 按类型获取bean
     * @param beanType
     * @param <T>
     * @return
     */
    @SuppressWarnings("unchecked")
    public static <T> T getBean(Class<T> beanType){
        Assert.isTrue(applicationContext != null, "应用上下文不能为空");
        T bean = applicationContext.getBean(beanType);
        return bean == null ? null : bean;
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringContextUtil.applicationContext = applicationContext;
    }
}
<think>我们正在使用RabbitMQ管理界面查看队列的总消息数量。根据引用[1]和引用[2],我们知道RabbitMQ管理界面提供了队列的详细监控信息。总消息数量由两部分组成:待消费的消息(Ready)和已消费但未确认的消息(Unacked)。因此,总消息数=Ready数量+Unacked数量。在RabbitMQ管理界面中查看队列消息数的步骤如下:1.登录RabbitMQ管理界面(默认地址:http://localhost:15672,使用安装时设置的用户名和密码登录,如引用[3]中示例的用户名为xiaolin,密码为123456)。2.在顶部导航栏点击“Queues”选项卡,进入队列列表页面。3.在队列列表中找到目标队列,可以看到该队列的“Total”列(即总消息数)或者分别查看“Ready”和“Unacked”的数量,然后相加。注意:在RabbitMQ管理界面的队列列表中,通常会直接显示一个“Total”列,该列的值就是队列的总消息数(即Ready+Unacked)。如果没有显示“Total”列,可以点击表格上方的“Columns”按钮,然后勾选“Total”来显示。另外,也可以进入队列的详情页面查看:点击队列名称进入队列详情页面,在“Overview”部分可以看到:-Messagesready:准备被消费的消息数量(Ready)-Messagesunacknowledged:已投递给消费者但尚未确认的消息数量(Unacked)-总消息数=Messagesready+Messagesunacknowledged因此,在管理界面中查看队列消息数非常直观。引用说明:[^1]提到使用RabbitMQ实现异步消息队列,包括安装配置和代码示例,但这里我们关注的是管理界面的使用。[^2]详细说明了RabbitMQ管理界面的功能,我们可以利用它来查看队列的状态。[^3]提供了使用Docker安装RabbitMQ并启用管理插件的命令,安装后即可访问管理界面。[^4]讨论了消息重回队列,但与我们当前的问题无关。根据以上信息,我们总结如下:在RabbitMQ管理界面查看队列消息数的步骤:1.访问管理界面(如http://localhost:15672)并登录。2.进入“Queues”选项卡。3.在队列列表中找到目标队列查看“Total”列(若没有显示,则通过“Columns”按钮添加)。4.或者点击队列名称进入详情页面,将“Messagesready”和“Messagesunacknowledged”相加得到总消息数。示例:队列列表页面中,某一行队列的“Total”列显示为15,则表示该队列当前总共有15条消息(包括待消费和未确认的)。注意:总消息数是一个动态变化的数值,会随着消息的发布和消费而实时变化。相关问题:1.RabbitMQ管理界面中如何查看消息的消费速率?2.如何通过RabbitMQ的HTTPAPI获取队列的总消息数?3.RabbitMQ队列消息堆积的原因有哪些?如何解决?</think>### 在 RabbitMQ 管理界面查看队列消息数的方法 #### 操作步骤: 1. **登录管理界面** - 访问 `http://<RabbitMQ地址>:15672`(默认端口15672)[^3] - 使用安装时配置的用户名密码登录(如引用[3]中的 `xiaolin/123456`) 2. **导航至队列视图** - 点击顶部菜单栏的 **Queues** 选项卡 3. **查看消息数** 在队列列表中直接查看 **Total** 列(该列显示队列当前总消息数),包含两部分: - **Ready**:待消费消息数量(蓝色数字) - **Unacked**:已消费未确认消息数量(橙色数字) - **总消息数 = Ready + Unacked** ![队列消息数示意图](https://rabbitmq.com/img/screenshots/queue-metrics.png) 4. **查看详情(可选)** 点击队列名称进入详情页,可看到: ```plaintext Overview └── Messages ├── Ready: 15 ├── Unacked: 3 └── Total: 18 # 这就是队列消息数 ``` #### 关键说明: 1. **消息状态含义**: - `Ready`:未被任何消费者处理的消息 - `Unacked`:已投递给消费者但未确认完成的消息(可能因消费者崩溃或手动重回队列产生[^4]) - `Total`:反映队列当前真实负载量 2. **数据刷新**: - 管理界面默认每5秒自动刷新一次 - 可点击右上角 **Refresh** 按钮手动刷新 3. **高级监控**: - 当总消息数持续增长时,需检查消费者处理能力[^1] - 可通过消息速率图分析入队/出队趋势[^2] > **实际案例**:某队列显示 `Total: 2,500`(其中 Ready: 2,000, Unacked: 500),表明: > 1. 有500条消息正在处理中(可能需检查确认机制[^4]) > 2. 有2,000条积压消息待消费(需优化消费者或扩容)
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值