消息队列-ActiveMQ学习笔记(二)-点对点消息实现

创建java项目,并导入jar包,activemq-all.jar包含了其全部的jar包
消息提供者代码:
[java]  view plain  copy
  1. package com.feiyang.activemq;  
  2.   
  3. import javax.jms.Connection;  
  4. import javax.jms.ConnectionFactory;  
  5. import javax.jms.Destination;  
  6. import javax.jms.JMSException;  
  7. import javax.jms.MessageProducer;  
  8. import javax.jms.Session;  
  9. import javax.jms.TextMessage;  
  10. import org.apache.activemq.ActiveMQConnection;  
  11. import org.apache.activemq.ActiveMQConnectionFactory;  
  12.   
  13. /** 
  14.  * 消息生产者 
  15.  *  
  16.  * @author MCL 
  17.  * 
  18.  */  
  19. public class JMSProducer {  
  20.     private static final String USERNAME = ActiveMQConnection.DEFAULT_USER;// 默认的连接的用户名  
  21.     private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;// 默认的连接密码  
  22.     private static final String BROKEURL = ActiveMQConnection.DEFAULT_BROKER_URL;// 默认的连接地址  
  23.     private static final int SENDNUM = 10;//发送消息的数量  
  24.   
  25.     public static void main(String[] args) {  
  26.         ConnectionFactory connectionFactory;// 连接工厂  
  27.         Connection connection =null;// 连接  
  28.         Session session;// 会话 发送或者接受消息的线程  
  29.         Destination destination;// 消息的目的地  
  30.         MessageProducer messageProducer;// 消息生产者  
  31.         // 实例化连接工厂  
  32.         connectionFactory = new ActiveMQConnectionFactory(JMSProducer.USERNAME, JMSProducer.PASSWORD,  
  33.                 JMSProducer.BROKEURL);  
  34.   
  35.         try {  
  36.             // 通过连接工厂获取连接  
  37.             connection = connectionFactory.createConnection();  
  38.             // 启动连接  
  39.             connection.start();  
  40.             // 创建session,第一个参数代表是否启用事务,第二参数代表接收的方式  
  41.             /* 
  42.              * Session.AUTO_ACKNOWLEDGE:当客户成功的从receive方法返回的时候, 
  43.              * 或者从MessageListener. onMessage()方法成功返回后,会话会自动确认客户收到信息。 
  44.              *  
  45.              * Session.CLIENT_ACKNOWLEDGE:客户通过消息的acknowledge方法确认消息。需要注意的是,在这种模式中 
  46.              * , 确认是在会话层上进行 ;确认一个被消费的消息将自动确认所有已被会话消费的消息。 例如:如果一个消息消费者消费 
  47.              * 了10个消息,然后确认第5个消息,那么所有10个消息都会被确认 
  48.              *  
  49.              * Session.DUPS_OK_ACKNOWLEDGE:该选择只是会话迟钝地确认消息的提提交。如果JMSprovider失败, 
  50.              * 那么可能会导致一些重复的消息。 
  51.              * 如果是重复的消息,那么JMSprovider必须把消息头的JMSRedelivered字段设置为true 
  52.              */  
  53.             session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);  
  54.             destination = session.createQueue("FirstQuene");//创建消息队列  
  55.             messageProducer = session.createProducer(destination);//创建消息生产者  
  56.             sendMessage(session, messageProducer);  
  57.             //由于设置添加事务,这里需要使用提交才能将数据发送出去  
  58.             session.commit();  
  59.               
  60.         } catch (JMSException e) {  
  61.             // TODO Auto-generated catch block  
  62.             e.printStackTrace();  
  63.         }finally {  
  64.             if(connection!=null){  
  65.                 try {  
  66.                     connection.close();  
  67.                 } catch (JMSException e) {  
  68.                     // TODO Auto-generated catch block  
  69.                     e.printStackTrace();  
  70.                 }  
  71.             }  
  72.         }  
  73.     }  
  74.     //发送消息  
  75.     public static void sendMessage(Session session,MessageProducer messageProducer){  
  76.         for(int i=0;i<JMSProducer.SENDNUM;i++){  
  77.             try {  
  78.                 TextMessage message = session.createTextMessage("");  
  79.                 System.out.println("发送消息:Active MQ发送消息");  
  80.                 messageProducer.send(message);  
  81.             } catch (JMSException e) {  
  82.                 // TODO Auto-generated catc h block  
  83.                 e.printStackTrace();  
  84.             }  
  85.         }  
  86.     }  
  87. }  
运行main方法之后,消息提供者就会将消息写入队列中,打开http://127.0.0.1:8161/admin/queues.jsp;查看quenes
可以看到,消息队列FirstQuene中有10条消息,并且10条消息都没有被消费。
消息消费者代码:
[java]  view plain  copy
  1. package com.feiyang.activemq;  
  2.   
  3. import javax.jms.Connection;  
  4. import javax.jms.ConnectionFactory;  
  5. import javax.jms.Destination;  
  6. import javax.jms.JMSException;  
  7. import javax.jms.MessageConsumer;  
  8. import javax.jms.Session;  
  9. import javax.jms.TextMessage;  
  10. import org.apache.activemq.ActiveMQConnection;  
  11. import org.apache.activemq.ActiveMQConnectionFactory;  
  12.   
  13. public class JMSConsumer {  
  14.     private static final String USERNAME = ActiveMQConnection.DEFAULT_USER;// 默认的连接的用户名  
  15.     private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;// 默认的连接密码  
  16.     private static final String BROKEURL = ActiveMQConnection.DEFAULT_BROKER_URL;// 默认的连接地址  
  17.     private static final int SENDNUM = 10;// 发送消息的数量  
  18.   
  19.     public static void main(String[] args) {  
  20.         ConnectionFactory connectionFactory;// 连接工厂  
  21.         Connection connection = null;// 连接  
  22.         Session session;// 会话 发送或者接受消息的线程  
  23.         Destination destination;// 消息的目的地  
  24.         MessageConsumer consumer;  
  25.   
  26.         connectionFactory = new ActiveMQConnectionFactory(JMSConsumer.USERNAME, JMSConsumer.PASSWORD,  
  27.                 JMSConsumer.BROKEURL);  
  28.         try {  
  29.             // 通过连接工厂获取连接  
  30.             connection = connectionFactory.createConnection();  
  31.             // 启动连接  
  32.             connection.start();  
  33.             session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE );//创建消息队列  
  34.             destination = session.createQueue("FirstQuene");//创建消息队列  
  35.             consumer = session.createConsumer(destination);  
  36.             /*通过receive方法接收消息:一般不用receive ,而是用监听 
  37.             while(true){ 
  38.                 TextMessage message =  (TextMessage) consumer.receive(100000);//100秒获取一次 
  39.                 if(message.getText()!=null){ 
  40.                     System.out.println("收到的消息:"+message.getText()); 
  41.                 }else{ 
  42.                     break; 
  43.                 } 
  44.             }*/  
  45.             //为消息消费者注册监听器  
  46.             consumer.setMessageListener(new MessageListener());  
  47.               
  48.               
  49.         } catch (JMSException e) {  
  50.             // TODO Auto-generated catch block  
  51.             e.printStackTrace();  
  52.         }   
  53.     }  
  54. }  
监听器代码:
[java]  view plain  copy
  1. package com.feiyang.activemq;  
  2.   
  3. import javax.jms.JMSException;  
  4. import javax.jms.Message;  
  5. import javax.jms.TextMessage;  
  6. /** 
  7.  * 消息监听器 
  8.  * @author MCL 
  9.  * 
  10.  */  
  11. public class MessageListener implements javax.jms.MessageListener{  
  12.   
  13.     @Override  
  14.     public void onMessage(Message message) {  
  15.         // TODO Auto-generated method stub  
  16.         try {  
  17.             System.out.println("收到的消息:"+((TextMessage)message).getText());  
  18.         } catch (JMSException e) {  
  19.             // TODO Auto-generated catch block  
  20.             e.printStackTrace();  
  21.         }  
  22.     }  
  23.   
  24. }  
运行消费者的代码,我们再来看后台管理的quenes。

可以看到,当前队列里面的消息已经被一个消费者消费掉了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值