总体说明:

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. bzoj1086

    题解: 树分块 每一次当个数大于B的时候分成一块 省会城市为当前子树根 然后最后剩下的节点和前一个分为一块 代码: #include<bits/stdc++.h> using namesp ...

  2. 51nod1288汽油补给

    考虑当前这个汽油站加的情况. 如果在t以内的范围有一个加油站比当前加油站便宜,那么就只需要加油加到足够开到最近的比自己便宜的加油站. 否则加满. 但是寻找超时 我们可以先加满,找到一个便宜的加油站之后 ...

  3. win764位下mysql-5.6.24-x64从安装到登录成功

    1.安装 本人电脑win7,64位,需要安装mysql服务器.版本:mysql-5.6.24-x64.这里我用的是绿色版,免安装.由于免安装的原因,在服务里面并没有mysql的服务.这里我需要打开my ...

  4. L1-022 奇偶分家

    给定N个正整数,请统计奇数和偶数各有多少个? 输入格式: 输入第一行给出一个正整N(≤1000):第2行给出N个正整数,以空格分隔. 输出格式: 在一行中先后输出奇数的个数.偶数的个数.中间以1个空格 ...

  5. DevExpress v17.2新版亮点—Analytics Dashboard篇(一)

    用户界面套包DevExpress v17.2日前终于正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了Analytics Dashboard v17.2 的新功能,快来下载试用新版本! ...

  6. Incremental Method

    「遞增法」是符合電腦運作特性的方法.電腦執行程式,一次只做一個動作,完成了一件事才做下一件事.當一個問題太大太多時,化整為零.一個一個解決吧! 合抱之木,生於毫末:九層之臺,起於累土:千里之行,始於足 ...

  7. 新手小白Linux(Centos6.5)部署java web项目(总)

    一.准备 1.linux  centos版本的相关命令操作,千万别找ubuntu的,好多命令都不一样,新手小白我傻傻不知道硬是浪费了一天的时间……(百度百科linux版本了解一下) 2.远程登录: P ...

  8. win10下tomcat环境搭建

    一.下载tomcat 用浏览器打开tomcat官网:http://tomcat.apache.org/ 在左侧的导航栏Download下方选择最新的Tomcat 9,点击页面下方的“ 64-bit W ...

  9. HDU 4185

    http://acm.hdu.edu.cn/showproblem.php?pid=4185 两个挨着的'#'可以配成一对,求最多能配成几对 挨着的'#'就连边,然后求一次最大匹配,答案是最大匹配除以 ...

  10. ubuntu16.04-caffe安装过程详解-草稿

    前言 目前主要模块都是基于深度学习展开的,虽然知道一些深度学习的基础知识,只是皮毛,还没有使用深度学习框架练手甚至深入,故开始着手深度学习的实操和深入学习. 操作步骤 参考 1.Ubuntu16.04 ...