总体说明:

1. 一个生产者/发布者:可以向多个目的地发送消息;
2. 每个目的地(destination)可以有多个订阅者或消费者;

如下图所示:



程序结构:

1. Publisher.java  :创建1个生产者和4个主题,遍历4个主题,生产者依次向4个主题中发送Message,共发送5次;
2.Consumer.java :消费者,创建8个消费者,每两个消费者订阅一个相同的主题,采用异步接收方式;
3. Listener.java   :异步监听


运行结果:

生产者:
消费者:



程序代码:

Publisher.java

  1. package com.ll.activemq;
  2. import javax.jms.Connection;
  3. import javax.jms.ConnectionFactory;
  4. import javax.jms.Destination;
  5. import javax.jms.JMSException;
  6. import javax.jms.MapMessage;
  7. import javax.jms.Message;
  8. import javax.jms.MessageProducer;
  9. import javax.jms.Session;
  10. import org.apache.activemq.ActiveMQConnectionFactory;
  11. import org.apache.activemq.command.ActiveMQMapMessage;
  12. public class Publisher {
  13. private ConnectionFactory factory;
  14. private Connection connection = null;
  15. private Session session;
  16. private String brokerURL = "tcp://localhost:61616";
  17. private MessageProducer producer;
  18. private Destination[] destinations;
  19. /**
  20. * 构造函数 创建连接、创建生产者
  21. *
  22. * @throws JMSException
  23. */
  24. public Publisher() throws JMSException {
  25. factory = new ActiveMQConnectionFactory(brokerURL);
  26. connection = factory.createConnection();
  27. try {
  28. connection.start();
  29. } catch (JMSException jmse) {
  30. connection.close();
  31. throw jmse;
  32. }
  33. session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
  34. producer = session.createProducer(null);
  35. }
  36. /**
  37. * 设置目的地
  38. *
  39. * @param stocks
  40. * :主题名列表
  41. * @throws JMSException
  42. */
  43. protected void setTopics(String[] stocks) throws JMSException {
  44. destinations = new Destination[stocks.length];
  45. for (int i = 0; i < stocks.length; i++) {
  46. destinations[i] = session.createTopic("STOCKS." + stocks[i]);
  47. }
  48. }
  49. /**
  50. * 创建消息
  51. *
  52. * @param stock
  53. * :主题名
  54. * @param session
  55. * @return
  56. * @throws JMSException
  57. */
  58. protected Message createStockMessage(String stock, Session session)
  59. throws JMSException {
  60. MapMessage message = session.createMapMessage();
  61. message.setString("stock", stock);
  62. message.setDouble("price", 1.00);
  63. message.setDouble("offer", 0.01);
  64. message.setBoolean("up", true);
  65. return message;
  66. }
  67. /**
  68. * 发送消息
  69. * 遍历所有主题(目的地),向每个目的地分别发送一个MapMessage
  70. * @param stocks
  71. * :主题名
  72. * @throws JMSException
  73. */
  74. protected void sendMessage(String[] stocks) throws JMSException {
  75. //遍历所有主题
  76. for (int i = 0; i < stocks.length; i++) {
  77. // 创建消息
  78. Message message = createStockMessage(stocks[i], session);
  79. System.out.println("发送: "
  80. + ((ActiveMQMapMessage) message).getContentMap()
  81. + " on destination: " + destinations[i]);
  82. // 往目的地发送消息
  83. producer.send(destinations[i], message);
  84. }
  85. }
  86. public void close() throws JMSException {
  87. try {
  88. if (null != connection)
  89. connection.close();
  90. } catch (Exception e) {
  91. e.printStackTrace();
  92. }
  93. }
  94. public static void main(String[] argss) throws JMSException {
  95. String[] topics = { "MyTopic1", "MyTopic2", "MyTopic3", "MyTopic4" };
  96. Publisher publisher = new Publisher();
  97. publisher.setTopics(topics);
  98. //每隔1s发送一次消息,共发送5次消息
  99. for (int i = 0; i < 5; i++) {
  100. System.out.println("发布者第:" + i + " 次发布消息...");
  101. publisher.sendMessage(topics);
  102. try {
  103. Thread.sleep(2000);
  104. } catch (InterruptedException e) {
  105. e.printStackTrace();
  106. }
  107. }
  108. publisher.close();
  109. }
  110. }

Consumer.java

  1. package com.ll.activemq;
  2. import javax.jms.Connection;
  3. import javax.jms.Destination;
  4. import javax.jms.JMSException;
  5. import javax.jms.MessageConsumer;
  6. import javax.jms.Session;
  7. import org.apache.activemq.ActiveMQConnectionFactory;
  8. public class Consumer {
  9. private ActiveMQConnectionFactory factory;
  10. private String brokerURL = "tcp://localhost:61616";
  11. private Connection connection = null;
  12. private Session session;
  13. public Consumer() throws JMSException {
  14. factory = new ActiveMQConnectionFactory(brokerURL);
  15. connection = factory.createConnection();
  16. connection.start();
  17. session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
  18. }
  19. public Session getSession() {
  20. return session;
  21. }
  22. public static void main(String[] args) throws JMSException {
  23. String[] topics = { "MyTopic1", "MyTopic2", "MyTopic3", "MyTopic4" };
  24. Consumer consumer = new Consumer();
  25. for (String stock : topics) {
  26. //创建目的地
  27. Destination destination = consumer.getSession().createTopic(
  28. "STOCKS." + stock);
  29. //创建消费者
  30. MessageConsumer messageConsumer = consumer.getSession()
  31. .createConsumer(destination);
  32. MessageConsumer messageConsumer2 = consumer.getSession()
  33. .createConsumer(destination);
  34. //设置监听器
  35. messageConsumer.setMessageListener(new Listener());
  36. messageConsumer2.setMessageListener(new Listener());
  37. }
  38. }
  39. }

Listener.java

  1. package com.ll.activemq;
  2. import java.text.DecimalFormat;
  3. import javax.jms.MapMessage;
  4. import javax.jms.Message;
  5. import javax.jms.MessageListener;
  6. public class Listener implements MessageListener {
  7. /**
  8. * 异步接收
  9. * 当有消息时,就会触发该事件
  10. */
  11. public void onMessage(Message message) {
  12. try {
  13. MapMessage map = (MapMessage)message;
  14. String stock = map.getString("stock");
  15. double price = map.getDouble("price");
  16. double offer = map.getDouble("offer");
  17. boolean up = map.getBoolean("up");
  18. DecimalFormat df = new DecimalFormat( "#,###,###,##0.00" );
  19. System.out.println("接收消息:"+stock + "\t" + df.format(price) + "\t" + df.format(offer) + "\t" + (up?"up":"down"));
  20. } catch (Exception e) {
  21. e.printStackTrace();
  22. }
  23. }
  24. }



延伸:


若是将上述程序中的 createTopic全部替换为createQueue,则运行结果如下:
生产者输出不变,这里就不截图了。
下面是消费者消费情况截图:
  





附件列表

【ActiveMQ入门-4】ActiveMQ学习-异步接收的更多相关文章

  1. ActiveMQ入门之四--ActiveMQ持久化方式

    消息持久性对于可靠消息传递来说应该是一种比较好的方法,有了消息持久化,即使发送者和接受者不是同时在线或者消息中心在发送者发送消息后宕机了,在消息中心重新启动后仍然可以将消息发送出去,如果把这种持久化和 ...

  2. ActiveMQ 入门和与 Spring 整合

    ActiveMQ 入门演示 activemq 依赖 <dependency> <groupId>org.apache.activemq</groupId> < ...

  3. 【ActiveMQ入门-10】ActiveMQ学习-通配符+异步接收

    通配符介绍: 一般情况下,我们使用层次结构的方式来组织队列,比如A.B.C.D,这样便于归类和管理.  我们也可以使用通配符来配置或是操作多个队列.  通配符有三个: .  用来分隔路径: * 用来匹 ...

  4. 【ActiveMQ入门-11】ActiveMQ学习-compositeDestination

    概要: 前一章讲解了消费者如何通过通配符来匹配目的地,以实现一个消费者同时接收多个目的地的消息. 对于生产者来讲,可能存在下面的需求: 1. 同一条message可能要发送到多个Queue: 2. 同 ...

  5. ActiveMQ学习总结(2)——ActiveMQ入门实例教程

    1.下载ActiveMQ 去官方网站下载:http://activemq.apache.org/ 2.运行ActiveMQ 解压缩apache-activemq-5.5.1-bin.zip,然后双击a ...

  6. 【ActiveMQ入门-5】ActiveMQ学习-消息持久性

    ActiveMQ中的消息持久性     ActiveMQ很好的支持了消息的持久性(Persistence).消息持久性对于可靠消息传递来说应该是一种比较好的方法,有了消息持久化,即使发送者和接受者不是 ...

  7. Dubbo入门到精通学习笔记(十四):ActiveMQ集群的安装、配置、高可用测试,ActiveMQ高可用+负载均衡集群的安装、配置、高可用测试

    文章目录 ActiveMQ 高可用集群安装.配置.高可用测试( ZooKeeper + LevelDB) ActiveMQ高可用+负载均衡集群的安装.配置.高可用测试 准备 正式开始 ActiveMQ ...

  8. Java消息中间件入门笔记 - ActiveMQ篇

    入门 消息中间件带来的好处: 1)解耦:系统解耦 2)异步:异步执行 3)横向扩展 4)安全可靠 5)顺序保证 栗子: 通过服务调用让其它系统感知事件发生 系统之间高耦合 程序执行效率低 通过消息中间 ...

  9. 消息中间件-activemq入门(二)

    上一节我们了解了JMS规范并且知道了JMS规范的良好实现者-activemq.今天我们就去了解一下activemq的使用.另外我们应该抱着目的去学习,别忘了我们为什么要使用消息中间件:解耦系统之间的联 ...

随机推荐

  1. 快速切题 sgu103. Traffic Lights 最短路 难度:1

    103. Traffic Lights Time limit per test: 0.25 second(s)Memory limit: 4096 kilobytes input: standardo ...

  2. golang模拟动态高优先权优先调度算法

    实验二  动态高优先权优先调度 实验内容 模拟实现动态高优先权优先(若数值越大优先权越高,每运行一个时间单位优先权-n,若数值越小优先权越高,没运行一个时间单位优先权+n),具体如下: 设置进程体:进 ...

  3. 主席树模板(poj 2104&&poj2761)

    主席树,就是n个线段树,用nlonn的空间实现 首先建立第一个线段树 把要查询的值离散化,建立值的线段树 每一次加入一个点 显然每一次只会修改logn个点 把其他的点直接建边连接即可 代码: #inc ...

  4. CodeIgniter $this->db->where()的自定义语句写法问题

    .自定义字符串:你可以手动的编写子句:$where = "name='Joe' AND status='boss' OR status='active'"; $this->d ...

  5. 难度2:ASCII码排序

    ASCII码排序 难度:2描述: 输入三个字符(可以重复)后,按各字符的ASCII码从小到大的顺序输出这三个字符. 输入: 第一行输入一个数N,表示有N组测试数据.后面的N行输入多组数据,每组输入数据 ...

  6. 部署和编写简单web项目

    初学的时候,使用默认的Web应用和默认的Servlet URL.对于正式的应用,则应使用定制的Web应用和URL(在部署描述文件web,xml中指定) 仿照默认Web应用的目录结构,创建目录 HTML ...

  7. JQuery, Silverlight 公用WCF

    WCF web.config配置: <?xml version="1.0"?> <configuration> <system.web> < ...

  8. iOS开发中,如何恢复到某一个版本(Cornerstone)

    Mac上的svn代码管理工具:Cornerstone 如何付恢复某个版本 第一:定位到你的工程,右上角边栏“Working Copy” ---->"Revert" 第二:选择 ...

  9. 人脸对齐matlab实现-FaceAlignment 3000fps

    前言 最近研读了孙剑团队的Face Alignment at 3000fps via Regressing Local Binary Features这篇paper,基于matlab进行实现. 实现原 ...

  10. 猎豹免费WiFi-随身WiFi共享热点,永久免费的无线路由器 - imsoft.cnblogs