使用activeMQ实现jms

使用activeMQ实现jms

 (2010-07-14 22:56:00)
标签: 

杂谈

分类: java高级应用

一:jms介绍
         jms说白了就是java message service,是J2EE规范的一部分,跟jdbc差不多,sun只提供了接口,由各个厂商(provider)来进行具体的实现,然后使用者使用他们的jar包进行开发使用即可。
        另外在jms的API中,jms传递消息有两种方式,一种是点对点的Queue,还有一个是发布订阅的Topic方式。区别在于:
        对于Queue模式,一个发布者发布消息,下面的接收者按队列顺序接收,比如发布了10个消息,两个接收者A,B那就是A,B总共会收到10条消息,不重复。
        对于Topic模式,一个发布者发布消息,有两个接收者A,B来订阅,那么发布了10条消息,A,B各收到10条消息。
       关于api的简单基础可以看下:http://www.javaeye.com/topic/64707,简单的参考!
二:ActiveMQ介绍
         activeMQ是apache下的一个开源jms产品,具体参见 apache官方网站;
         Apache ActiveMQ is fast, supports many  Cross Language Clients and Protocols , comes with easy to use  Enterprise Integration Patterns   and many  advanced features   while fully supporting  JMS 1.1   and J2EE 1.4. Apache ActiveMQ is released under the  Apache   2.0 License
三:开始实现代码
       1:使用activeMQ来完成jms的发送,必须要下载activeMQ,然后再本机安装,并且启动activeMQ的服务才行。在官网下载完成之后,运行bin目录下面的activemq.bat,将activeMQ成功启动。
       启动成功之后可以运行:http://localhost:8161/admin/index.jsp  查看一下。
       2:发送端,sender

  1. import javax.jms.Connection;   
  2. import javax.jms.ConnectionFactory;   
  3. import javax.jms.DeliveryMode;   
  4. import javax.jms.Destination;   
  5. import javax.jms.MessageProducer;   
  6. import javax.jms.Session;   
  7. import javax.jms.TextMessage;   
  8.   
  9. import org.apache.activemq.ActiveMQConnection;   
  10. import org.apache.activemq.ActiveMQConnectionFactory;   
  11.   
  12. public class Sender {   
  13.     private static final int SEND_NUMBER = 5;   
  14.   
  15.     public static void main(String[] args) {   
  16.         // ConnectionFactory :连接工厂,JMS 用它创建连接   
  17.         ConnectionFactory connectionFactory;   
  18.         // Connection :JMS 客户端到JMS Provider 的连接   
  19.         Connection connection = null;   
  20.         // Session: 一个发送或接收消息的线程   
  21.         Session session;   
  22.         // Destination :消息的目的地;消息发送给谁.   
  23.         Destination destination;   
  24.         // MessageProducer:消息发送者   
  25.         MessageProducer producer;   
  26.         // TextMessage message;   
  27.         // 构造ConnectionFactory实例对象,此处采用ActiveMq的实现jar   
  28.   
  29.         connectionFactory = new ActiveMQConnectionFactory(   
  30.                 ActiveMQConnection.DEFAULT_USER,   
  31.                 ActiveMQConnection.DEFAULT_PASSWORD,   
  32.                 "tcp://localhost:61616");   
  33.         try {   
  34.             // 构造从工厂得到连接对象   
  35.             connection = connectionFactory.createConnection();   
  36.             // 启动   
  37.             connection.start();   
  38.             // 获取操作连接   
  39.             session = connection.createSession(Boolean.TRUE,   
  40.                     Session.AUTO_ACKNOWLEDGE);   
  41.             // 获取session注意参数值xingbo.xu-queue是一个服务器的queue,须在在ActiveMq的console配置   
  42.             destination = session.createQueue("test-queue");   
  43.             // 得到消息生成者【发送者】   
  44.             producer = session.createProducer(destination);   
  45.             // 设置不持久化,可以更改   
  46.             producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);   
  47.             // 构造消息   
  48.             sendMessage(session, producer);   
  49.             session.commit();   
  50.   
  51.         } catch (Exception e) {   
  52.             e.printStackTrace();   
  53.         } finally {   
  54.             try {   
  55.                 if (null != connection)   
  56.                     connection.close();   
  57.             } catch (Throwable ignore) {   
  58.             }   
  59.         }   
  60.   
  61.     }   
  62.     public static void sendMessage(Session session, MessageProducer producer)   
  63.             throws Exception {   
  64.         for (int i = 1; i <=SEND_NUMBER; i++) {   
  65.             TextMessage message = session   
  66.                     .createTextMessage("ActiveMq 发送的消息" + i);   
  67.             // 发送消息到目的地方   
  68.             System.out.println("发送消息:" + i);   
  69.             producer.send(message);   
  70.         }   
  71.     }   
  72. }   
  73.   
  74.      
  75.        3:接收端,receive   
  76.   
  77.     
  78.   
  79. import javax.jms.Connection;   
  80. import javax.jms.ConnectionFactory;   
  81. import javax.jms.Destination;   
  82. import javax.jms.JMSException;   
  83. import javax.jms.Message;   
  84. import javax.jms.MessageConsumer;   
  85. import javax.jms.MessageListener;   
  86. import javax.jms.Session;   
  87. import javax.jms.TextMessage;   
  88.   
  89. import org.apache.activemq.ActiveMQConnection;   
  90. import org.apache.activemq.ActiveMQConnectionFactory;   
  91.   
  92. public class Receiver {   
  93.     public static void main(String[] args) {   
  94.   
  95.         // ConnectionFactory :连接工厂,JMS 用它创建连接   
  96.         ConnectionFactory connectionFactory;   
  97.         // Connection :JMS 客户端到JMS Provider 的连接   
  98.         Connection connection = null;   
  99.         // Session: 一个发送或接收消息的线程   
  100.         Session session;   
  101.         // Destination :消息的目的地;消息发送给谁.   
  102.         Destination destination;   
  103.         // 消费者,消息接收者   
  104.         MessageConsumer consumer;   
  105.   
  106.         connectionFactory = new ActiveMQConnectionFactory(   
  107.                 ActiveMQConnection.DEFAULT_USER,   
  108.                 ActiveMQConnection.DEFAULT_PASSWORD, "tcp://localhost:61616");   
  109.         try {   
  110.             // 构造从工厂得到连接对象   
  111.             connection = connectionFactory.createConnection();   
  112.             // 启动   
  113.             connection.start();   
  114.             // 获取操作连接   
  115.             session = connection.createSession(Boolean.FALSE,   
  116.                     Session.AUTO_ACKNOWLEDGE);   
  117.             //test-queue跟sender的保持一致,一个创建一个来接收   
  118.             destination = session.createQueue("test-queue");   
  119.             consumer = session.createConsumer(destination);   
  120.             consumer.setMessageListener(new MessageListener() {   
  121.                 public void onMessage(Message arg0) {   
  122.                     System.out.println("==================");   
  123.                     try {   
  124.                         System.out.println("RECEIVE1第一个获得者:"  
  125.                                 + ((TextMessage) arg0).getText());   
  126.                     } catch (JMSException e) {   
  127.                         // TODO Auto-generated catch block   
  128.                         e.printStackTrace();   
  129.                     }   
  130.   
  131.                 }   
  132.             });   
  133.   
  134.             MessageConsumer consumer1 = session.createConsumer(destination);   
  135.             consumer1.setMessageListener(new MessageListener() {   
  136.                 public void onMessage(Message arg0) {   
  137.                     System.out.println("+++++++++++++++++++");   
  138.                     try {   
  139.                         System.out.println("RECEIVE1第二个获得者:"  
  140.                                 + ((TextMessage) arg0).getText());   
  141.                     } catch (JMSException e) {   
  142.                         // TODO Auto-generated catch block   
  143.                         e.printStackTrace();   
  144.                     }   
  145.   
  146.                 }   
  147.             });   
  148.         } catch (Exception e) {   
  149.             e.printStackTrace();   
  150.         }   
  151.         //在eclipse里运行的时候,这里不要关闭,这样就可以一直等待服务器发送了,不然就直接结束了。   
  152.         // } finally {   
  153.         // try {   
  154.         // if (null != connection)   
  155.         // connection.close();   
  156.         // } catch (Throwable ignore) {   
  157.         // }   
  158.         // }   
  159.   
  160.     }   
  161. }   
  162.   
  163.      
  164.     
  165.   
  166.        4:发送端,sender 上面的是用Queue的方式来创建,下面再用topic的方式实现同样的功能。   
  167.   
  168.     
  169.   
  170. import javax.jms.Connection;   
  171. import javax.jms.JMSException;   
  172. import javax.jms.Message;   
  173. import javax.jms.MessageConsumer;   
  174. import javax.jms.MessageListener;   
  175. import javax.jms.MessageProducer;   
  176. import javax.jms.Session;   
  177. import javax.jms.TextMessage;   
  178. import javax.jms.Topic;   
  179.   
  180. import org.apache.activemq.ActiveMQConnectionFactory;   
  181. import org.apache.activemq.command.ActiveMQTopic;   
  182.   
  183. public class TopicTest {   
  184.     public static void main(String[] args) throws Exception {   
  185.         ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(   
  186.                 "tcp://localhost:61616");   
  187.   
  188.         Connection connection = factory.createConnection();   
  189.         connection.start();   
  190.   
  191.         // 创建一个Topic   
  192.         Topic topic = new ActiveMQTopic("testTopic");   
  193.         Session session = connection.createSession(false,   
  194.                 Session.AUTO_ACKNOWLEDGE);   
  195.   
  196.         // 注册消费者1   
  197.         MessageConsumer comsumer1 = session.createConsumer(topic);   
  198.         comsumer1.setMessageListener(new MessageListener() {   
  199.             public void onMessage(Message m) {   
  200.                 try {   
  201.                     System.out.println("Consumer1 get "  
  202.                             + ((TextMessage) m).getText());   
  203.                 } catch (JMSException e) {   
  204.                     e.printStackTrace();   
  205.                 }   
  206.             }   
  207.         });   
  208.   
  209.         // 注册消费者2   
  210.         MessageConsumer comsumer2 = session.createConsumer(topic);   
  211.         comsumer2.setMessageListener(new MessageListener() {   
  212.             public void onMessage(Message m) {   
  213.                 try {   
  214.                     System.out.println("Consumer2 get "  
  215.                             + ((TextMessage) m).getText());   
  216.                 } catch (JMSException e) {   
  217.                     e.printStackTrace();   
  218.                 }   
  219.             }   
  220.   
  221.         });   
  222.   
  223.         // 创建一个生产者,然后发送多个消息。   
  224.         MessageProducer producer = session.createProducer(topic);   
  225.         for (int i = 0; i < 10; i++) {   
  226.             System.out.println("producer begin produce=======");   
  227.             producer.send(session.createTextMessage("Message:" + i));   
  228.         }   
  229.     }   
  230.   
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章