先上原文链接:
http://blog.163.com/chengwei_1104/blog/static/53645274201382315842515/ ActiveMQ 持久化(文件),查询队列剩余消息数、出队数的实现
http://blog.csdn.net/hjxgood/article/details/18706759 ActiveMQ 远程监控JMX设置
现在在做一个分布式爬虫程序,用到了activemq。大概的思路是爬取的路径写到mq,然后爬虫轮询mq,再去爬。中间爬取中的一些中间信息,也会写mq。考虑到mq的容量问题,所以需要对activemq中还未消费的消息进行一个统计。
查阅了上面两篇文章,对我的帮助很大,在此记录一下。
1、设置消息持久化为文件
activemq默认的是支持持久化为文件的
网上说持久化有三种,分别是文件、mysql、oracle,详细配置见下面的文章:
http://www.360doc.com/content/11/1027/19/1542811_159664912.shtml
剩下就是在写消息的时候设置
// 设置JMS的持久性,持久化为文件
producer.setDeliveryMode(DeliveryMode.PERSISTENT);
2、activemq设置
第一个配置:
<broker xmlns="http://activemq.apache.org/schema/core" schedulePeriodForDestinationPurge="30000" brokerName="broker" useJmx="true" dataDirectory="${activemq.data}">
schedulePeriodForDestinationPurge这个是设置mq自动清理消息的标签。因为在消息消费完毕之后,topic还会依然存在,个人强迫症。
useJmx表示开启jmx监控
另外两个标签就没啥好解释的。
第二个配置:
<managementContext>
<managementContext createConnector="true" jmxDomainName="myDomain" connectorPath="/jmxrmi" connectorPort="11099"/>
</managementContext>
这个配置主要是jmx具体的配置,见上面的原文链接的第二条。
第三个,读取剩余消息的代码
String url = "service:jmx:rmi:///jndi/rmi://localhost:11099/jmxrmi";
JMXServiceURL urls = new JMXServiceURL(url);
JMXConnector connector = JMXConnectorFactory.connect(urls,null);
connector.connect();
MBeanServerConnection conn = connector.getMBeanServerConnection();
//这里brokerName的b要小些,大写会报错
ObjectName name = new ObjectName("myDomain:brokerName=broker,type=Broker");
BrokerViewMBean mBean = (BrokerViewMBean)MBeanServerInvocationHandler.newProxyInstance
(conn, name, BrokerViewMBean.class, true);
for(ObjectName na : mBean.getQueues()){
QueueViewMBean queueBean = (QueueViewMBean)
MBeanServerInvocationHandler.newProxyInstance
(conn, na, QueueViewMBean.class, true);
System.out.println("******************************");
System.out.println("队列的名称:"+queueBean.getName());
System.out.println("队列中剩余的消息数:"+queueBean.getQueueSize());
System.out.println("消费者数:"+queueBean.getConsumerCount());
System.out.println("出队列的数量:"+queueBean.getDequeueCount());
}
}
虽然做到这一步,但是还是觉得不太好,因为需要单独写个程序实时去取这些数据。个人想让mq自动把这部分数据实时推送到redis,这样就很容易拿到数据了,等后续弄出来了再更。