【ActiveMQ入门-10】ActiveMQ学习-通配符+异步接收
- . 用来分隔路径;
- * 用来匹配路径中的一节
- > 用来匹配任意节的路径
然而, 通配符中是为消费者服务的。==>即:消费者可以使用通配符来匹配目的地,而生产者不行。
1. 消费者:异步接收,实现
MessageListener类;



源文件:
package com.nari.spring.jms2;import javax.jms.JMSException;import javax.jms.Message;import javax.jms.MessageListener;import javax.jms.TextMessage;public class JmsMessageListener implements MessageListener {public void onMessage(Message message) {System.out.println("消息全部内容:" + message.toString());try {System.out.println("消息主题:" + message.getJMSDestination().toString());} catch (JMSException e1) {e1.printStackTrace();}TextMessage tm = (TextMessage) message;try {System.out.println("消息体:" + tm.getText());} catch (JMSException e) {e.printStackTrace();}}}
package com.nari.spring.jms2;import java.util.Scanner;import javax.jms.Destination;import javax.jms.JMSException;import javax.jms.Message;import javax.jms.Session;import javax.jms.TextMessage;import org.apache.activemq.command.ActiveMQTopic;import org.springframework.jms.core.JmsTemplate;import org.springframework.jms.core.MessageCreator;public class Publisher {//下面两个field,在applicationContext-*.xml配置private JmsTemplate template;private Destination destination;public void sendMessage() {long keyValue = 302001011;boolean sendMsgFlag = true;int addIndex = 0;System.out.println("输入主题内容,输入N停止发送消息:");while (sendMsgFlag) {// 从终端输入信息Scanner cin = new Scanner(System.in);String text = cin.nextLine();if (text.equals("N")) {sendMsgFlag = false;}// 目的地地址为:topic://on3000.topic.*int startIndex = destination.toString().indexOf("//");int endIndex = destination.toString().indexOf("*");// 拼接新的主题:类似 on3000.topic.30200101112String subTopicDestination = destination.toString().substring(startIndex + 2, endIndex)+ Long.toString(keyValue + addIndex);//发送消息jmsTemplateSend(subTopicDestination, text);addIndex++;}}/*** 向指定主题发送指定消息** @param destinationString* :主题* @param strMessage* :消息内容*/protected void jmsTemplateSend(String destinationString,final String strMessage) {ActiveMQTopic topicDestination = new ActiveMQTopic(destinationString);template.send(topicDestination, new MessageCreator() {public Message createMessage(Session session) throws JMSException {TextMessage message = session.createTextMessage();message.setText(strMessage);return message;}});}public JmsTemplate getJmsTemplate() {return template;}public void setJmsTemplate(JmsTemplate template) {this.template = template;}public Destination getDestination() {return destination;}public void setDestination(Destination destination) {this.destination = destination;}}
package com.nari.spring.jms2;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-2.xml");// applicationContext-*.xml初始化时,貌似会自动开启subscribe,下面两行注不注释掉都可以// DefaultMessageListenerContainer subscribe = (DefaultMessageListenerContainer)context.getBean("consumer");// subscribe.start();Publisher publisher = (Publisher) context.getBean("publisher");publisher.sendMessage();}}
applicationContext-2.xml
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"><!--创建连接工厂 --><bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"><property name="brokerURL" value="tcp://localhost:61616" /></bean><!-- 声明目标,ActiveMQQueue或ActiveMQTopic --><bean id="topicDestination" class="org.apache.activemq.command.ActiveMQTopic"autowire="constructor"><!-- 通配符,匹配多个主题 --><constructor-arg value="on3000.topic.*" /></bean><!-- 创建JMS发送信息的模板的对象 --><bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"><property name="connectionFactory" ref="connectionFactory" /><property name="defaultDestination" ref="topicDestination" /><property name="receiveTimeout" value="6000" /></bean><!-- 生成者 --><bean id="publisher" class="com.nari.spring.jms2.Publisher"><property name="jmsTemplate" ref="jmsTemplate" /><property name="destination" ref="topicDestination" /></bean><!-- 消息监听接口 --><bean id="jmsMessageListener" class="com.nari.spring.jms2.JmsMessageListener"></bean><!-- 消费者,通过消息侦听器实现 --><bean id="consumer"class="org.springframework.jms.listener.DefaultMessageListenerContainer"><property name="connectionFactory" ref="connectionFactory" /><property name="destination" ref="topicDestination" /><property name="messageListener" ref="jmsMessageListener" /></bean></beans>

附件列表
【ActiveMQ入门-10】ActiveMQ学习-通配符+异步接收的更多相关文章
- ActiveMQ入门之四--ActiveMQ持久化方式
消息持久性对于可靠消息传递来说应该是一种比较好的方法,有了消息持久化,即使发送者和接受者不是同时在线或者消息中心在发送者发送消息后宕机了,在消息中心重新启动后仍然可以将消息发送出去,如果把这种持久化和 ...
- ActiveMQ 入门和与 Spring 整合
ActiveMQ 入门演示 activemq 依赖 <dependency> <groupId>org.apache.activemq</groupId> < ...
- 【ActiveMQ入门-4】ActiveMQ学习-异步接收
总体说明: 1. 一个生产者/发布者:可以向多个目的地发送消息: 2. 每个目的地(destination)可以有多个订阅者或消费者: 如下图所示: 程序结构: 1. Publisher.java ...
- 【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)顺序保证 栗子: 通过服务调用让其它系统感知事件发生 系统之间高耦合 程序执行效率低 通过消息中间 ...
- .Net平台下ActiveMQ入门实例
1.ActiveMQ简介 先分析这么一个场景:当我们在网站上购物时,必须经过,下订单.发票创建.付款处理.订单履行.航运等.但是,当用户下单后,立即跳转到“感谢那您的订单” 页面.不仅如此,若果没有延 ...
随机推荐
- C#实现在注册表中保存信息
C#实现在注册表中保存信息 最近做的项目需要在注册表中记录一些用户设置,方便在程序下次启动时读取设置,应用上次用户保存的设置,挺简单的. 写出来,方便记忆,以后要用,可以直接改改就能用. 1 usin ...
- vuex 简单理解
废话不多说,直接上图! 不懂的 参考 API
- LA3905
题意: 给出n颗流星,第i颗在第T秒时飞到(xi+ai*t,yi+bi*t),给出一个矩形,问在某一时刻这个矩形中的流星数目最多有多少 题解: 首先计算出每一颗流星经过时间 然后左端点移动,计算出少了 ...
- DevExpress v17.2新版亮点—ASP.NET篇(三)
用户界面套包DevExpress v17.2终于正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了DevExpress ASP.NET v17.2 的GridView Control. ...
- 20165210 Java第八周学习总结
20165210 Java第八周学习总结 教材内容学习 - 第十二章学习总结 进程与线程 操作系统与进程 Java中的线程 Java的多线程机制 主线程 线程的状态与生命周期 1. 新建 2. 运行 ...
- the usage of String
经典算法:(整理汇总) 1)如何快速倒叙: public static char[] reverseArray(char[] c){ char t; for(int i=0;i<c.length ...
- 在C#中如何定义一个变长的结构数组?如果定义好了,如何获得当前数组的长度?
用ArrayList,他就相当于动态数组,用add方法添加元素,remove删除元素,count计算长度
- qt5 交叉编译
qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf 添加 QMAKE_LFLAGS += -Wl,-rpath-link,$$[QT_SYSROOT]/us ...
- matplotlib.pyplot中add_subplot方法参数111的含义
下述代码若要运行,得在安装Python之外安装matplotlib.numpy.scipy.six等库,专门来看这篇小贴的朋友应该知道这些库. 参数331的意思是:将画布分割成3行3列,图像画在从左到 ...
- valgrind- 内存泄漏-how to install and use
1.how to install my host computer is ARM, U need to Attention yours... valgrind下载: http://valgrind.o ...