rocketMQ消息堆积监控的java实现一

     最近遇到rocketMq的消息堆积的问题,一边学习一边处理,rocketMq的消息堆积发现应该分为两层,一层是broker中实际写入消息量和consumeQueue已经消费位移的偏差,另外一层consumer端本身已经拉取消息的堆积。

     对于第一层的堆积监控处理如下:

    /**
     * 监听rocketMq中的消息数量
     * @return
     */

  1.     public long getDiffTotal () {
  2.         DefaultMQAdminExt defaultMQAdminExt =  ApplicationContext.getInstance().getDefaultMQAdminExt();
  3.         long diffTotal = 0L;
  4.         try {
  5.             // 当消费端未消费时,此方法会报错
  6. ConsumeStats consumeStats = defaultMQAdminExt.examineConsumeStats("QueryTask_ConsumerGroup_hmzx_hmzx_xgq_test");
  7.             List<MessageQueue> mqList = new LinkedList();
  8.             Set<MessageQueue> keySet = consumeStats.getOffsetTable().keySet();
  9.             mqList.addAll(keySet);
  10.             Collections.sort(mqList);
  11.             // 遍历所有的队列,计算堆积量
  12.             for (MessageQueue mq : mqList) {
  13.                 // 只计算group下此生产端发送对应的Topic
  14.                 if ("QueryTask".equals(mq.getTopic())) {
  15.                     OffsetWrapper offsetWrapper = (OffsetWrapper) consumeStats.getOffsetTable().get(mq);
  16.                     long diff = offsetWrapper.getBrokerOffset() - offsetWrapper.getConsumerOffset();
  17.                     diffTotal += diff;
  18.                     //System.err.println("diffjianting:"+diff);
  19.                 }
  20.             }
  21.         } catch (Throwable e) {
  22.             log.error("监控客户端获取消息堆积量异常,未能正常获取消息堆积量,消息堆积量默认设置为0", e);
  23.             // 此中出现任何错误,均返回堆积量为0;
  24.             diffTotal = 0L;
  25.         }
  26. //        System.err.println("diffTotal"+diffTotal);
  27.         return diffTotal;
  28.        }
  29.  

猜你喜欢

转载自blog.csdn.net/qiucheng_198806/article/details/81629775