activemq读取剩余消息队列中消息的数量

先上原文链接:

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,这样就很容易拿到数据了,等后续弄出来了再更。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值