<span style= "font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);" > </span><span style= "font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);" >MQ相关介绍:http://blog.youkuaiyun.com/luckyzhoustar/article/details/ 51286554 </span>
RocketMq是一个纯Java 、分布式、队列模型的的开源的消息中间件,但是目前相关的资料较少,所以出现了问题很难找到解决方案。
1、MQ 消息生产:http://blog.youkuaiyun.com/luckyzhoustar/article/details/51286559
2、MQ 消息订阅:http://blog.youkuaiyun.com/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
3、结果:
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); }
调用此方法可以直接查询到。。。