总体说明:

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. Python 字符串转换为字典(String to Dict)

    一.需求 为了处理从redis中拿到的value,如下 {"appId":"ct","crawlSts":false,"healt ...

  2. 《Python》 面向对象三大特性之继承

    一.继承大纲: 继承和抽象(两个概念) 1.单继承: 语法: 父类.基类.超类 子类.派生类 继承与重用:子类可以使用父类中的名字(变量和方法) 继承与派生:子类在父类的基础上又新创建了自己需要的方法 ...

  3. 前端必学库之bootstrap

    想要成为一个全栈程序员,其实有很多技术线路.很多人说有了nodejs后,只学JAVASCRIPT就可以了.其实,会NODEJS后端开发,严格来说算是高级前端.就站长个人理解,后端的主流还是4P:jsp ...

  4. vector中erase用法注意事项

    以前就发现了vector中的erase方法有些诡异(^_^),稍不注意,就会出错.今天又一次遇到了,就索性总结一下,尤其是在循环体中用erase时,由于vector.begin() 和vector.e ...

  5. iPad mini Retina越狱小结【2014年02月06日 - 初稿】

    Update History 2014年02月06日 - 初稿 0.引言 本来一直都没有苹果的产品除了第一代的iPod(没怎么使用最后大学送人了 @李清纯(255270520) ,巧合的是老妈学校发了 ...

  6. doom启示录

    半个小时之后,doom的最后一个字节抵达威斯康星大学,瞬间,上万名玩家涌向那台服务器,淹没了她,威斯康星大学的服务器瘫痪了,大卫的服务器崩溃了. “天哪”大卫在电话里结结巴巴地对杰伊说:“我还从没见过 ...

  7. Python id

    # id()函数可以帮我们查看一个变量的内存地址 a = 10 b = 30 print(id(a)) print(id(b)) lst = ["周杰伦","麻花藤&qu ...

  8. 基础练习 Huffuman树

     基础练习 Huffuman树   时间限制:1.0s   内存限制:512.0MB        问题描述 Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给 ...

  9. 【转】游戏buff设计参见

    其实这类帖子并没有多少的设计理论,对于策划的提升和帮助也并不大,原因其实在于其适用性太窄,当我要设计XX象棋的时候,它就滚一边去了. 废话不多说切入正题: 游戏中的BUFF/DEBUFF我们见过很多, ...

  10. ElasticSearch—分页查询

    ElasticSearch查询—分页查询详解 Elasticsearch中数据都存储在分片中,当执行搜索时每个分片独立搜索后,数据再经过整合返回.那么,如何实现分页查询呢? 按照一般的查询流程来说,如 ...