ActiveMQ发消息、收消息、持久化,查询队列剩余消息数、出队数的实现

187 篇文章 0 订阅

http://my.oschina.net/u/264430/blog/57318

 

最近老大让我使用ActiveMQ实现这么个东东:1.查询消息队列中还有多少任务没有执行;2.消息队列的持久化;

真是愁杀我也,以前没见过啊,于是又看文档,又百度又google的,最终还是在一天半之后整出来鸟~~

首先向大家介绍一本书籍《ActiveMQ in Action》,我大部分代码都是参考这本书实现的。好了,废话少说,看代码:

1.首先启动activeMQ的服务

01public class RunServer {
02 
03/** 启动activeMQ服务 */
04public static void main(String[] args) throws Exception {
05RunServer rs = new RunServer();
06BrokerService broker = rs.startServer();
07}
08
09public BrokerService startServer() throws Exception{
10// java代码调用activemq相关的类来构造并启动brokerService
11BrokerService broker = new BrokerService();
12 
13// 以下是持久化的配置
14// 持久化文件存储位置
15File dataFilterDir = new File("targer/amq-in-action/kahadb");
16KahaDBStore kaha = new KahaDBStore();
17kaha.setDirectory(dataFilterDir);
18// use a bigger journal file
19kaha.setJournalMaxFileLength(1024*100);
20// small batch means more frequent and smaller writes
21kaha.setIndexWriteBatchSize(100);
22// do the index write in a separate thread
23kaha.setEnableIndexWriteAsync(true);
24
25broker.setPersistenceAdapter(kaha);
26// create a transport connector
27broker.addConnector("tcp://localhost:61616");
28broker.setUseJmx(true);
29//broker.setDataDirectory("data/");
30
31 
32// 以下是ManagementContext的配置,从这个容器中可以取得消息队列中未执行的消息数、消费者数、出队数等等
33// 设置ManagementContext
34ManagementContext context = broker.getManagementContext();
35context.setConnectorPort(2011);
36context.setJmxDomainName("my-broker");
37context.setConnectorPath("/jmxrmi");
38broker.start();
39System.in.read();
40return broker;
41}

2.发送消息

01public class Sender {
02private static final int SEND_NUMBER = 1;
03 
04public static void main(String[] args) {
05// ConnectionFactory :连接工厂,JMS 用它创建连接
06ConnectionFactory connectionFactory;
07// Connection :JMS 客户端到JMS Provider 的连接
08Connection connection = null;
09// Session: 一个发送或接收消息的线程
10Session session;
11// Destination :消息的目的地;消息发送给谁.
12Destination destination;
13// MessageProducer:消息发送者
14MessageProducer producer;
15// TextMessage message;
16// 构造ConnectionFactory实例对象,此处采用ActiveMq的实现jar
17 
18connectionFactory = new ActiveMQConnectionFactory(
19ActiveMQConnection.DEFAULT_USER,
20ActiveMQConnection.DEFAULT_PASSWORD,
21"tcp://localhost:61616");
22try {
23// 构造从工厂得到连接对象
24connection = connectionFactory.createConnection();
25// 启动
26connection.start();
27// 获取操作连接
28session = connection.createSession(Boolean.TRUE,
29Session.AUTO_ACKNOWLEDGE);
30// 获取session注意参数值xingbo.xu-queue是一个服务器的queue,须在在ActiveMq的console配置
31destination = session.createQueue("test-persistence");
32// 得到消息生成者【发送者】
33producer = session.createProducer(destination);
34// 设置不持久化,可以更改
35producer.setDeliveryMode(DeliveryMode.PERSISTENT);
36// 构造消息
37sendMessage(session, producer);
38session.commit();
39 
40} catch (Exception e) {
41e.printStackTrace();
42} finally {
43try {
44if (null != connection)
45connection.close();
46} catch (Throwable ignore) {
47}
48}
49 
50}
51 
52public static void sendMessage(Session session, MessageProducer producer)
53throws Exception {
54for (int i = 1; i <= SEND_NUMBER; i++) {
55TextMessage message = session
56.createTextMessage("ActiveMq 发送的消息" + i);
57// 发送消息到目的地方
58System.out.println("发送消息:" + i);
59producer.send(message);
60}
61}

3.收消息

01public class Receiver {
02public static void main(String[] args) {
03// ConnectionFactory :连接工厂,JMS 用它创建连接
04ConnectionFactory connectionFactory;
05// Connection :JMS 客户端到JMS Provider 的连接
06Connection connection = null;
07// Session: 一个发送或接收消息的线程
08Session session;
09// Destination :消息的目的地;消息发送给谁.
10Destination destination;
11// 消费者,消息接收者
12MessageConsumer consumer;
13 
14connectionFactory = new ActiveMQConnectionFactory(
15ActiveMQConnection.DEFAULT_USER,
16ActiveMQConnection.DEFAULT_PASSWORD, "tcp://localhost:61616");
17try {
18// 构造从工厂得到连接对象
19connection = connectionFactory.createConnection();
20// 启动
21connection.start();
22// 获取操作连接
23session = connection.createSession(Boolean.TRUE,
24Session.AUTO_ACKNOWLEDGE);
25//test-queue跟sender的保持一致,一个创建一个来接收
26destination = session.createQueue("test-persistence");
27consumer = session.createConsumer(destination);
28
29consumer.setMessageListener(new MessageListener() {
30public void onMessage(Message arg0) {
31try {
32Thread.sleep(1000);
33} catch (InterruptedException e1) {
34e1.printStackTrace();
35}
36System.out.println("==================");
37try {
38System.out.println("RECEIVE1第一个获得者:"
39+ ((TextMessage) arg0).getText());
40} catch (JMSException e) {
41// TODO Auto-generated catch block
42e.printStackTrace();
43}
44
45}
46});
47} catch (Exception e) {
48e.printStackTrace();
49}
50finally {
51try {
52if (null != connection)
53connection.close();
54} catch (Throwable ignore) {
55}
56}
57}
58}

4.获取消息的状态,也就是上面所说的获得消息队列中未执行的消息数、消费者数、出队数等等

01public class StateTest {
02 
03/**
04* 获取状态
05* @throws Exception
06*/
07public static void main(String[] args) throws Exception {
08JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:2011/jmxrmi");
09JMXConnector connector = JMXConnectorFactory.connect(url, null);
10connector.connect();
11MBeanServerConnection connection = connector.getMBeanServerConnection();
12 
13// 需要注意的是,这里的my-broker必须和上面配置的名称相同
14ObjectName name = new ObjectName("my-broker:BrokerName=localhost,Type=Broker");
15BrokerViewMBean mBean = (BrokerViewMBean)MBeanServerInvocationHandler.newProxyInstance(connection, name, BrokerViewMBean.class, true);
16// System.out.println(mBean.getBrokerName());
17
18for(ObjectName queueName : mBean.getQueues()) {
19QueueViewMBean queueMBean = (QueueViewMBean)MBeanServerInvocationHandler.newProxyInstance(connection, queueName, QueueViewMBean.class, true);
20System.out.println("\n------------------------------\n");
21 
22// 消息队列名称
23System.out.println("States for queue --- " + queueMBean.getName());
24 
25// 队列中剩余的消息数
26System.out.println("Size --- " + queueMBean.getQueueSize());
27 
28// 消费者数
29System.out.println("Number of consumers --- " + queueMBean.getConsumerCount());
30 
31// 出队数
32System.out.println("Number of dequeue ---" + queueMBean.getDequeueCount() );
33}
34
35}
36 
37}

到此结束,希望可以为大家做个参考~~

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值