总体说明:

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. 慕课网笔记之oracle开发利器-PL/SQL基础

    实例1--if语句 /* 慕课网Oracle数据库开发必备之PL/SQL_2-3 判断用户从键盘输入的数字 1.如何使用if语句 2.接收一个键盘的输入(字符串) */ set serveroutpu ...

  2. C++字符串函数之append()、insert()

    仅记录自己比较容易忘的几个: B.insert(1,A,2,2) 将A中的从第3个字符开始的2个字符插入到B的第1个字符后面(字符串A和B实际上分别是const char [5]和const char ...

  3. CriticalSection 临界区

    // 临界区.cpp : 定义控制台应用程序的入口点.// #include "stdafx.h"#include<windows.h>#include<iost ...

  4. L1-014 简单题

    这次真的没骗你 —— 这道超级简单的题目没有任何输入. 你只需要在一行中输出事实:This is a simple problem. 就可以了. 输入样例: 无 输出样例: This is a sim ...

  5. SharePoint Visio Graphics Service-PowerShell

    1. 配置托管服务账户 Set-SPVisioExternalData -VisioServiceApplication "Visio Graphics Service" –Una ...

  6. php include,require 主要是向网页中引入文件

  7. Redis 学习第一课:安装Linux Redis(Ubantu)

    对于分布式缓存,之前公司项目中只使用了MemCached,使用比较方便,有现成的C#版本组件. 如今用Redis的公司有很多,所以打算了解一下Redis. Redis的官网地址:http://redi ...

  8. 使用Inno Setup Compiler制作安装软件包

    前言 项目开发完成之后,需要程序打包发行,本文使用Inno Setup工具制作安装软件包. 系统环境 系统:win7_x64 工具:Inno Setup Complier 实现步骤 1.下载安装Inn ...

  9. 我的第一个Mybatis程序

    第一个Mybatis程序 在JDBC小结中(可以参阅本人JDBC系列文章),介绍到了ORM,其中Mybatis就是一个不错的ORM框架 MyBatis由iBatis演化而来 iBATIS一词来源于“i ...

  10. laravel集合

    1.简介 Illuminate\Support\Collection 类为处理数组数据提供了平滑.方便的封装.例如,查看下面的代码,我们使用辅助函数 collect 创建一个新的集合实例,为每一个元素 ...