最近遇到rocketMq的消息堆积的问题,一边学习一边处理,rocketMq的消息堆积发现应该分为两层,一层是broker中实际写入消息量和consumeQueue已经消费位移的偏差,另外一层consumer端本身已经拉取消息的堆积。
对于第一层的堆积监控处理如下:
/**
* 监听rocketMq中的消息数量
* @return
*/
- public long getDiffTotal () {
- DefaultMQAdminExt defaultMQAdminExt = ApplicationContext.getInstance().getDefaultMQAdminExt();
- long diffTotal = 0L;
- try {
- // 当消费端未消费时,此方法会报错
- ConsumeStats consumeStats = defaultMQAdminExt.examineConsumeStats("QueryTask_ConsumerGroup_hmzx_hmzx_xgq_test");
- List<MessageQueue> mqList = new LinkedList();
- Set<MessageQueue> keySet = consumeStats.getOffsetTable().keySet();
- mqList.addAll(keySet);
- Collections.sort(mqList);
- // 遍历所有的队列,计算堆积量
- for (MessageQueue mq : mqList) {
- // 只计算group下此生产端发送对应的Topic
- if ("QueryTask".equals(mq.getTopic())) {
- OffsetWrapper offsetWrapper = (OffsetWrapper) consumeStats.getOffsetTable().get(mq);
- long diff = offsetWrapper.getBrokerOffset() - offsetWrapper.getConsumerOffset();
- diffTotal += diff;
- //System.err.println("diffjianting:"+diff);
- }
- }
- } catch (Throwable e) {
- log.error("监控客户端获取消息堆积量异常,未能正常获取消息堆积量,消息堆积量默认设置为0", e);
- // 此中出现任何错误,均返回堆积量为0;
- diffTotal = 0L;
- }
- // System.err.println("diffTotal"+diffTotal);
- return diffTotal;
- }