【ActiveMQ入门-4】ActiveMQ学习-异步接收
1. 一个生产者/发布者:可以向多个目的地发送消息;

1. Publisher.java :创建1个生产者和4个主题,遍历4个主题,生产者依次向4个主题中发送Message,共发送5次;
生产者:


Publisher.java
package com.ll.activemq;import javax.jms.Connection;import javax.jms.ConnectionFactory;import javax.jms.Destination;import javax.jms.JMSException;import javax.jms.MapMessage;import javax.jms.Message;import javax.jms.MessageProducer;import javax.jms.Session;import org.apache.activemq.ActiveMQConnectionFactory;import org.apache.activemq.command.ActiveMQMapMessage;public class Publisher {private ConnectionFactory factory;private Connection connection = null;private Session session;private String brokerURL = "tcp://localhost:61616";private MessageProducer producer;private Destination[] destinations;/*** 构造函数 创建连接、创建生产者** @throws JMSException*/public Publisher() throws JMSException {factory = new ActiveMQConnectionFactory(brokerURL);connection = factory.createConnection();try {connection.start();} catch (JMSException jmse) {connection.close();throw jmse;}session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);producer = session.createProducer(null);}/*** 设置目的地** @param stocks* :主题名列表* @throws JMSException*/protected void setTopics(String[] stocks) throws JMSException {destinations = new Destination[stocks.length];for (int i = 0; i < stocks.length; i++) {destinations[i] = session.createTopic("STOCKS." + stocks[i]);}}/*** 创建消息** @param stock* :主题名* @param session* @return* @throws JMSException*/protected Message createStockMessage(String stock, Session session)throws JMSException {MapMessage message = session.createMapMessage();message.setString("stock", stock);message.setDouble("price", 1.00);message.setDouble("offer", 0.01);message.setBoolean("up", true);return message;}/*** 发送消息* 遍历所有主题(目的地),向每个目的地分别发送一个MapMessage* @param stocks* :主题名* @throws JMSException*/protected void sendMessage(String[] stocks) throws JMSException {//遍历所有主题for (int i = 0; i < stocks.length; i++) {// 创建消息Message message = createStockMessage(stocks[i], session);System.out.println("发送: "+ ((ActiveMQMapMessage) message).getContentMap()+ " on destination: " + destinations[i]);// 往目的地发送消息producer.send(destinations[i], message);}}public void close() throws JMSException {try {if (null != connection)connection.close();} catch (Exception e) {e.printStackTrace();}}public static void main(String[] argss) throws JMSException {String[] topics = { "MyTopic1", "MyTopic2", "MyTopic3", "MyTopic4" };Publisher publisher = new Publisher();publisher.setTopics(topics);//每隔1s发送一次消息,共发送5次消息for (int i = 0; i < 5; i++) {System.out.println("发布者第:" + i + " 次发布消息...");publisher.sendMessage(topics);try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}}publisher.close();}}
Consumer.java
package com.ll.activemq;import javax.jms.Connection;import javax.jms.Destination;import javax.jms.JMSException;import javax.jms.MessageConsumer;import javax.jms.Session;import org.apache.activemq.ActiveMQConnectionFactory;public class Consumer {private ActiveMQConnectionFactory factory;private String brokerURL = "tcp://localhost:61616";private Connection connection = null;private Session session;public Consumer() throws JMSException {factory = new ActiveMQConnectionFactory(brokerURL);connection = factory.createConnection();connection.start();session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);}public Session getSession() {return session;}public static void main(String[] args) throws JMSException {String[] topics = { "MyTopic1", "MyTopic2", "MyTopic3", "MyTopic4" };Consumer consumer = new Consumer();for (String stock : topics) {//创建目的地Destination destination = consumer.getSession().createTopic("STOCKS." + stock);//创建消费者MessageConsumer messageConsumer = consumer.getSession().createConsumer(destination);MessageConsumer messageConsumer2 = consumer.getSession().createConsumer(destination);//设置监听器messageConsumer.setMessageListener(new Listener());messageConsumer2.setMessageListener(new Listener());}}}
Listener.java
package com.ll.activemq;import java.text.DecimalFormat;import javax.jms.MapMessage;import javax.jms.Message;import javax.jms.MessageListener;public class Listener implements MessageListener {/*** 异步接收* 当有消息时,就会触发该事件*/public void onMessage(Message message) {try {MapMessage map = (MapMessage)message;String stock = map.getString("stock");double price = map.getDouble("price");double offer = map.getDouble("offer");boolean up = map.getBoolean("up");DecimalFormat df = new DecimalFormat( "#,###,###,##0.00" );System.out.println("接收消息:"+stock + "\t" + df.format(price) + "\t" + df.format(offer) + "\t" + (up?"up":"down"));} catch (Exception e) {e.printStackTrace();}}}
延伸:
若是将上述程序中的 createTopic全部替换为createQueue,则运行结果如下:
附件列表
【ActiveMQ入门-4】ActiveMQ学习-异步接收的更多相关文章
- ActiveMQ入门之四--ActiveMQ持久化方式
消息持久性对于可靠消息传递来说应该是一种比较好的方法,有了消息持久化,即使发送者和接受者不是同时在线或者消息中心在发送者发送消息后宕机了,在消息中心重新启动后仍然可以将消息发送出去,如果把这种持久化和 ...
- ActiveMQ 入门和与 Spring 整合
ActiveMQ 入门演示 activemq 依赖 <dependency> <groupId>org.apache.activemq</groupId> < ...
- 【ActiveMQ入门-10】ActiveMQ学习-通配符+异步接收
通配符介绍: 一般情况下,我们使用层次结构的方式来组织队列,比如A.B.C.D,这样便于归类和管理. 我们也可以使用通配符来配置或是操作多个队列. 通配符有三个: . 用来分隔路径: * 用来匹 ...
- 【ActiveMQ入门-11】ActiveMQ学习-compositeDestination
概要: 前一章讲解了消费者如何通过通配符来匹配目的地,以实现一个消费者同时接收多个目的地的消息. 对于生产者来讲,可能存在下面的需求: 1. 同一条message可能要发送到多个Queue: 2. 同 ...
- ActiveMQ学习总结(2)——ActiveMQ入门实例教程
1.下载ActiveMQ 去官方网站下载:http://activemq.apache.org/ 2.运行ActiveMQ 解压缩apache-activemq-5.5.1-bin.zip,然后双击a ...
- 【ActiveMQ入门-5】ActiveMQ学习-消息持久性
ActiveMQ中的消息持久性 ActiveMQ很好的支持了消息的持久性(Persistence).消息持久性对于可靠消息传递来说应该是一种比较好的方法,有了消息持久化,即使发送者和接受者不是 ...
- Dubbo入门到精通学习笔记(十四):ActiveMQ集群的安装、配置、高可用测试,ActiveMQ高可用+负载均衡集群的安装、配置、高可用测试
文章目录 ActiveMQ 高可用集群安装.配置.高可用测试( ZooKeeper + LevelDB) ActiveMQ高可用+负载均衡集群的安装.配置.高可用测试 准备 正式开始 ActiveMQ ...
- Java消息中间件入门笔记 - ActiveMQ篇
入门 消息中间件带来的好处: 1)解耦:系统解耦 2)异步:异步执行 3)横向扩展 4)安全可靠 5)顺序保证 栗子: 通过服务调用让其它系统感知事件发生 系统之间高耦合 程序执行效率低 通过消息中间 ...
- 消息中间件-activemq入门(二)
上一节我们了解了JMS规范并且知道了JMS规范的良好实现者-activemq.今天我们就去了解一下activemq的使用.另外我们应该抱着目的去学习,别忘了我们为什么要使用消息中间件:解耦系统之间的联 ...
随机推荐
- iis 7 asp.net ajax post 请求字节过大报错问题解决办法
遇到一个ajax post 提交新闻资讯类的文章,报 {"Message":"There was an error processing the request.&quo ...
- npm install mysql --save-dev
npm install X: 会把X包安装到node_modules目录中 不会修改package.json 之后运行npm install命令时,不会自动安装X npm install X –sav ...
- JProfiler性能分析
之前已经介绍过如何调试本地的JBoss.现在额外一篇文章关于如何远程调试Tomcat的,其实远程和本地的区别不大,主要区别只是,JProfiler的GUI运行在你本地,而JProfiler的Agent ...
- slice,Array.prototype.slice,Array.protyotype.slice.call
slice 特点:基于当前数组中的一或多个项创建一个新数组.[原数组不会被修改] 返回结果:返回一个从开始到结束(不包括结束)选择的数组的一部分浅拷贝到一个新数组对象. 语法: arr.slice() ...
- Quartz表结构说明
一.表信息解析: 1.1. qrtz_blob_triggers : 以Blob 类型存储的触发器. 1.2. qrtz_calendars:存放日历信息, quartz可配置一个日历来指定一个时间范 ...
- html网页设计
对于html文档可以直接通过浏览器打开并解释执行,不需要使用服务器.一个html文档的架构,一般由3对标签构成:<html></html>,<head></h ...
- MyEclipse 2017 CI 9 发布(附下载)
挑战全年最低价!MyEclipse线上狂欢继续!火热开启中>> 在进入年底之时,2017 CI 9是我们最大的版本发布之一.在新版本中,我们添加了对Angular 5和TypeScript ...
- SharePoint 2013的100个新功能之内容管理(二)
一:数据视图 SharePoint2013中的数据视图更多的是作为多项目编辑的视图.数据视图在列表项目区域打开项目,选择停止编辑时保存项目的更改.在自定义列表中,你可以选择编辑项目,它会以数据视图编辑 ...
- 【转】WinForm基础
winform基础 先修基础:C#语法基础和面向对象编程 1.Winform创建解决方案 2.Winform窗体 3.MessageBOx 4.Winform登录.控制软件只运行一次.回车登录 5.W ...
- win10下tomcat环境搭建
一.下载tomcat 用浏览器打开tomcat官网:http://tomcat.apache.org/ 在左侧的导航栏Download下方选择最新的Tomcat 9,点击页面下方的“ 64-bit W ...