通配符介绍:

一般情况下,我们使用层次结构的方式来组织队列,比如A.B.C.D,这样便于归类和管理。
 我们也可以使用通配符来配置或是操作多个队列。
 通配符有三个:
  1. .  用来分隔路径;
  2. * 用来匹配路径中的一节
  3. > 用来匹配任意节的路径

然而, 通配符中是为消费者服务的。==>即:消费者可以使用通配符来匹配目的地,而生产者不行。

如果你发送了这样的一个主题:" rugby.>.", 这个消息会发送到命名为“rugby.>.”的主题,并不是所有以rugby开头的的主题。

 这里有一种  方法,使消息生产者能将一条。 
 消息发送到多个目的地。通过使用   composite destination。《本小节暂不讲解》

程序概要:

1. 消费者:异步接收,实现

MessageListener类;

2.从消息中获取 目的地名称: message.getJMSDestination().toString();
3.消费模式:发布/订阅模式;
4.目的地名称:采用通配符形式:on3000.topic.*;


环境:

1.JmsMessageListener.java
2.Publisher.java
3.Test.java
4.applicationContext-2.xml

所使用的jar包
activemq-all-5.8.0.jar
activemq-all-5.8.0.source.jar
commons-logging-1.1.1.jar
spring-asm-3.1.2.RELEASE.jar
spring-beans-3.1.2.RELEASE.jar
spring-context-3.1.2.RELEASE.jar
spring-context-support-3.1.2.RELEASE.jar
spring-core-3.1.2.RELEASE.jar
spring-expression-3.1.2.RELEASE.jar
spring-jms-3.1.2.RELEASE.jar
spring-tx-3.1.2.RELEASE.jar



源文件:

JmsMessageListener.java 异步接收

  1. package com.nari.spring.jms2;
  2. import javax.jms.JMSException;
  3. import javax.jms.Message;
  4. import javax.jms.MessageListener;
  5. import javax.jms.TextMessage;
  6. public class JmsMessageListener implements MessageListener {
  7. public void onMessage(Message message) {
  8. System.out.println("消息全部内容:" + message.toString());
  9. try {
  10. System.out.println("消息主题:" + message.getJMSDestination().toString());
  11. } catch (JMSException e1) {
  12. e1.printStackTrace();
  13. }
  14. TextMessage tm = (TextMessage) message;
  15. try {
  16. System.out.println("消息体:" + tm.getText());
  17. } catch (JMSException e) {
  18. e.printStackTrace();
  19. }
  20. }
  21. }


Publisher.java

  1. package com.nari.spring.jms2;
  2. import java.util.Scanner;
  3. import javax.jms.Destination;
  4. import javax.jms.JMSException;
  5. import javax.jms.Message;
  6. import javax.jms.Session;
  7. import javax.jms.TextMessage;
  8. import org.apache.activemq.command.ActiveMQTopic;
  9. import org.springframework.jms.core.JmsTemplate;
  10. import org.springframework.jms.core.MessageCreator;
  11. public class Publisher {
  12. //下面两个field,在applicationContext-*.xml配置
  13. private JmsTemplate template;
  14. private Destination destination;
  15. public void sendMessage() {
  16. long keyValue = 302001011;
  17. boolean sendMsgFlag = true;
  18. int addIndex = 0;
  19. System.out.println("输入主题内容,输入N停止发送消息:");
  20. while (sendMsgFlag) {
  21. // 从终端输入信息
  22. Scanner cin = new Scanner(System.in);
  23. String text = cin.nextLine();
  24. if (text.equals("N")) {
  25. sendMsgFlag = false;
  26. }
  27. // 目的地地址为:topic://on3000.topic.*
  28. int startIndex = destination.toString().indexOf("//");
  29. int endIndex = destination.toString().indexOf("*");
  30. // 拼接新的主题:类似 on3000.topic.30200101112
  31. String subTopicDestination = destination.toString().substring(
  32. startIndex + 2, endIndex)
  33. + Long.toString(keyValue + addIndex);
  34. //发送消息
  35. jmsTemplateSend(subTopicDestination, text);
  36. addIndex++;
  37. }
  38. }
  39. /**
  40. * 向指定主题发送指定消息
  41. *
  42. * @param destinationString
  43. * :主题
  44. * @param strMessage
  45. * :消息内容
  46. */
  47. protected void jmsTemplateSend(String destinationString,
  48. final String strMessage) {
  49. ActiveMQTopic topicDestination = new ActiveMQTopic(destinationString);
  50. template.send(topicDestination, new MessageCreator() {
  51. public Message createMessage(Session session) throws JMSException {
  52. TextMessage message = session.createTextMessage();
  53. message.setText(strMessage);
  54. return message;
  55. }
  56. });
  57. }
  58. public JmsTemplate getJmsTemplate() {
  59. return template;
  60. }
  61. public void setJmsTemplate(JmsTemplate template) {
  62. this.template = template;
  63. }
  64. public Destination getDestination() {
  65. return destination;
  66. }
  67. public void setDestination(Destination destination) {
  68. this.destination = destination;
  69. }
  70. }


Test.java

  1. package com.nari.spring.jms2;
  2. import org.springframework.context.ApplicationContext;
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;
  4. public class Test {
  5. public static void main(String[] args) {
  6. ApplicationContext context = new ClassPathXmlApplicationContext(
  7. "applicationContext-2.xml");
  8. // applicationContext-*.xml初始化时,貌似会自动开启subscribe,下面两行注不注释掉都可以
  9. // DefaultMessageListenerContainer subscribe = (DefaultMessageListenerContainer)context.getBean("consumer");
  10. // subscribe.start();
  11. Publisher publisher = (Publisher) context.getBean("publisher");
  12. publisher.sendMessage();
  13. }
  14. }


配置文件:

applicationContext-2.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
  5. <!--创建连接工厂 -->
  6. <bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
  7. <property name="brokerURL" value="tcp://localhost:61616" />
  8. </bean>
  9. <!-- 声明目标,ActiveMQQueue或ActiveMQTopic -->
  10. <bean id="topicDestination" class="org.apache.activemq.command.ActiveMQTopic"
  11. autowire="constructor">
  12. <!-- 通配符,匹配多个主题 -->
  13. <constructor-arg value="on3000.topic.*" />
  14. </bean>
  15. <!-- 创建JMS发送信息的模板的对象 -->
  16. <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
  17. <property name="connectionFactory" ref="connectionFactory" />
  18. <property name="defaultDestination" ref="topicDestination" />
  19. <property name="receiveTimeout" value="6000" />
  20. </bean>
  21. <!-- 生成者 -->
  22. <bean id="publisher" class="com.nari.spring.jms2.Publisher">
  23. <property name="jmsTemplate" ref="jmsTemplate" />
  24. <property name="destination" ref="topicDestination" />
  25. </bean>
  26. <!-- 消息监听接口 -->
  27. <bean id="jmsMessageListener" class="com.nari.spring.jms2.JmsMessageListener">
  28. </bean>
  29. <!-- 消费者,通过消息侦听器实现 -->
  30. <bean id="consumer"
  31. class="org.springframework.jms.listener.DefaultMessageListenerContainer">
  32. <property name="connectionFactory" ref="connectionFactory" />
  33. <property name="destination" ref="topicDestination" />
  34. <property name="messageListener" ref="jmsMessageListener" />
  35. </bean>
  36. </beans>


运行结果:



 



附件列表

【ActiveMQ入门-10】ActiveMQ学习-通配符+异步接收的更多相关文章

  1. ActiveMQ入门之四--ActiveMQ持久化方式

    消息持久性对于可靠消息传递来说应该是一种比较好的方法,有了消息持久化,即使发送者和接受者不是同时在线或者消息中心在发送者发送消息后宕机了,在消息中心重新启动后仍然可以将消息发送出去,如果把这种持久化和 ...

  2. ActiveMQ 入门和与 Spring 整合

    ActiveMQ 入门演示 activemq 依赖 <dependency> <groupId>org.apache.activemq</groupId> < ...

  3. 【ActiveMQ入门-4】ActiveMQ学习-异步接收

    总体说明: 1. 一个生产者/发布者:可以向多个目的地发送消息: 2. 每个目的地(destination)可以有多个订阅者或消费者: 如下图所示: 程序结构: 1. Publisher.java   ...

  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. .Net平台下ActiveMQ入门实例

    1.ActiveMQ简介 先分析这么一个场景:当我们在网站上购物时,必须经过,下订单.发票创建.付款处理.订单履行.航运等.但是,当用户下单后,立即跳转到“感谢那您的订单” 页面.不仅如此,若果没有延 ...

随机推荐

  1. Struts2内置校验器——完整实例代码

    一.校验器的配置风格 1.字段校验器: <field name="被校验的字段"> <field-validator type="校验器名"& ...

  2. 《Python》 内置函数

    一.内置函数: Python给你提供的,拿来直接用的函数,比如print.input等等,就是内置函数. 截止到Python版本3.6.2,现在Python一共为我们提供了68个内置函数.       ...

  3. python 的StringIO

    python 3.4以后StringIO和cStringIO就没有了,转移到 io,的StringIO和BytesIO from io import StringIO fp=StringIO( ) 1 ...

  4. postgresql的copy

    https://www.postgresql.org/docs/current/static/sql-copy.html 一.Copy的基本语法 Copy的作用是复制数据在数据表和文件之间. Copy ...

  5. 使用Query进行HQL语句查询和SQL语句查询

    HQL的语法比较简单,与普通SQL的区别之处是针对对象的不同,在查询语句中将sql中的表名替换成了sql中的持久化类名,因为hibernate机制是基于对象进行查询的. 不带参数的查询,语句是“fro ...

  6. hibernate 各种主键生成策略(转)

    http://www.cnblogs.com/kakafra/archive/2012/09/16/2687569.html 1.assigned 主键由外部程序负责生成,在 save() 之前必须指 ...

  7. 解决Ubuntu下添加Log却无法输出(高通平台)

    1.首先考虑到的是你所添加Log的位置确实没有被调用或者在调用前发生异常终止掉了. 2.你修改后没有进行编译或者没有push/install 3.如果你当前的系统版本是User版本,你在push的时候 ...

  8. jmeter随笔(34)-WebSocket协议接口测试实战

    2017年春节结束了,一切再次回归到正轨,我们飞测也开始继续分享,小怪在这里预祝大家在2017年工作顺利,满满的收获. 背景:今天研发哥们QQ我,请教websocket协议的接口测试,这哥们自己开发了 ...

  9. IOS UIImage两种初始化的区别

    UIImage可以通过以下两种方式进行初始化: 1 //第一种初始化方式:[注意使用这种初始化的时候如果是png格式的可以不给后缀名,根据屏幕的的分辨率去匹配图片] 2 3 UIImage *imag ...

  10. 修改类不重启tomcat 自动加载项目

    可以修改类不用重启Tomcat加载整个项目(手工启动)     配置reloadable=true(自动重载)     使用Debug模式,前提是仅限于局部修改.(修改类不用重启--热加载) Tomc ...