转载:https://blog.csdn.net/wangqingqi20005/article/details/52245141
RocketMq是一个纯Java、分布式、队列模型的的开源的消息中间件,但是目前相关的资料较少,所以出现了问题很难找到解决方案。
1、MQ 消息生产:http://blog.csdn.net/luckyzhoustar/article/details/51286559
2、MQ 消息订阅:http://blog.csdn.net/luckyzhoustar/article/details/51286560
在使用过程中,需要用查询生产的消息,可以根据Key和Id查询消息。
一、根据key查询消息
1、运维命令
文档:
指令 |
queryMsgByKey |
类路径 |
com.alibaba.rocketmq.tools.command.message.QueryMsgByKeySubCommand |
||
参数 |
是否必填 |
说明 |
|||
-f |
否 |
被查询消息的截止时间 |
|||
-k |
是 |
msgKey |
|||
-t |
是 |
Topic名称 |
|||
-h |
否 |
打印帮助 |
|||
-n |
是 |
nameserve服务地址列表,格式ip:port;ip:port;... |
|||
举例 |
查询Topic= ZTEExample下key= SimpleTest-1的消息,nameserve地址为10.45.47.168:9876 |
||||
sh mqadmin queryMsgByKey -n 10.45.47.168:9876 -t ZTEExample -k SimpleTest-1 打印内容: #Message ID #QID #Offset 0A2D2FA800002A9F0000000000000000 0 0 |
2、实例:
- sh mqadmin queryMsgByKey -n 10.10.4.184:9876 -t SCANRECORD -k b4d83f23-36fe-4890-946c-a2dcccc67572
- Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=128m; support was removed in 8.0
- Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=128m; support was removed in 8.0
- #Message ID #QID #Offset
- 0A0A04B800002A9F0000005C597BACE1 1 66788391
可以得到消息的这个key下面所有的msgId,然后可以通过查询到的id在定位到具体消息
二、根据msgId查询消息
1、文档:
指令 |
queryMsgById |
类路径 |
com.alibaba.rocketmq.tools.command.message.QueryMsgByIdSubCommand |
||
参数 |
是否必填 |
说明 |
|||
-i |
是 |
msgId |
|||
-h |
否 |
打印帮助 |
|||
-n |
是 |
nameserve服务地址列表,格式ip:port;ip:port;... |
|||
举例 |
查询msgId= 0A2D2FA800002A9F0000000000000000的消息,nameserve地址为10.45.47.168:9876 |
||||
sh mqadmin queryMsgById –n 10.45.47.168:9876 –i 0A2D2FA800002A9F0000000000000000 打印内容: Topic: ZTEExample Tags: [SimpleTest] Keys: [SimpleTest-1] Queue ID: 0 Queue Offset: 0 CommitLog Offset: 0 Born Timestamp: 2014-02-26 14:49:10,875 Store Timestamp: 2014-02-26 14:48:44,840 Born Host: 10.45.46.229:4231 Store Host: 10.45.47.168:10911 System Flag: 0 Properties: {TAGS=SimpleTest, KEYS=SimpleTest-1, WAIT=true} Message Body Path: /tmp/rocketmq/msgbodys/0A2D2FA800002A9F0000000000000000 |
2、实例:
- [root@master bin]# sh mqadmin queryMsgById -n 10.10.4.184:9876 -i 0A0A04B800002A9F0000005C597BACE1
3、结果:
- ava HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=128m; support was removed in 8.0
- Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=128m; support was removed in 8.0
- Topic: SCANRECORD
- Tags: [1]
- Keys: [b4d83f23-36fe-4890-946c-a2dcccc67572]
- Queue ID: 1
- Queue Offset: 66788391
- CommitLog Offset: 396638268641
- Reconsume Times: 0
- Born Timestamp: 2016-08-18 20:18:51,648
- Store Timestamp: 2016-08-18 20:19:15,456
- Born Host: 10.10.42.177:62899
- Store Host: 10.10.4.184:10911
- System Flag: 0
- Properties: {KEYS=b4d83f23-36fe-4890-946c-a2dcccc67572, WAIT=true, TAGS=1}
- Message Body Path: /tmp/rocketmq/msgbodys/0A0A04B800002A9F0000005C597BACE1
- MessageTrack [consumerGroup=WOBUXINHAIYOU, trackType=UNKNOW_EXCEPTION, exceptionDesc=com.alibaba.rocketmq.client.exception.MQBrokerException: CODE: 206 DESC: the consumer group[WOBUXINHAIYOU] not online
- For more information, please visit the url, https://github.com/alibaba/RocketMQ/issues/48, com.alibaba.rocketmq.client.impl.MQClientAPIImpl.getConsumerConnectionList(MQClientAPIImpl.java:1189)]
通过ID查询到消息,可以看到消息的存放路径,和该消息的相关信息,已经该消息的消费状态。
通过API 方式调用查询消息。通过此功能可以在源码的基础上,自己封装成页面,查询每条消息的生命周期。
一、根据Key查询消息
DefaultMQProducer 类中有提供 queryMessage 方法,
- @Override
- public QueryResult queryMessage(String topic, String key, int maxNum, long begin, long end)
- throws MQClientException, InterruptedException {
- return this.defaultMQProducerImpl.queryMessage(topic, key, maxNum, begin, end);
- }
但是方法中需要的参数,maxNum,bengin,end 在没有注释的情况下,并不知道具体传什么参数,在阅读源码后,
begin和end 需要的是时间戳格式,所以确认传入的应该是查询时间。同时通过key可以查询多个msgId,maxNum应该的查询个数。
- QueryResult res =mqProducerBiz.queryMessage(topic, key, 100,
- <span style="white-space:pre"> </span>(new Date().getTime()-(2*60*60*1000)),(new Date().getTime()+(2*60*60*1000)));
尝试当前时间前后两小时 该KEY下面的100条数据。
当时返回结果为null。失败。。。。
github,oschina,官方文档在查询无果之后,最后上了阿里云,查询和rocketMQ收费版的ONS文档,
在查询消息的文档中发现很重要的一句话
贴上原文地址:https://help.aliyun.com/document_detail/29540.html?spm=5176.doc29536.6.107.HVVHro
查询数量不能超过64条,修改maxNum为10.
成功查询到刚刚丢进去的消息。。。
根据ID查询相对简单,
- @Override
- public MessageExt viewMessage(String msgId) throws RemotingException, MQBrokerException,
- InterruptedException, MQClientException {
- return this.defaultMQProducerImpl.viewMessage(msgId);
- }
调用此方法可以直接查询到。。。