通配符介绍:

一般情况下,我们使用层次结构的方式来组织队列,比如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. JS将日期转化为unix时间戳

    var str = '2008-10-09 21:35:28';//PHP中对应的UNIX时间戳为1223559328 var new_str = str.replace(/:/g,'-'); new ...

  2. Linux免密码登陆

    A电脑实现不用密码登陆到B电脑! vim /etc/ssh/sshd_config   编辑文件 01.在A电脑上生成ssh密钥 ssh-keygen -t rsa02.把A电脑生成的id_rsa.p ...

  3. DevExpress v18.1新版亮点——WPF篇(五)

    用户界面套包DevExpress v18.1日前终于正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了DevExpress WPF v18.1 的新功能,快来下载试用新版本!点击下载& ...

  4. Java不同场景oom错误探究及解决办法

    1.OOM for Heap=>java.lang.OutOfMemoryError: Java heap space 分  析 此OOM是由于JVM中heap的最大值不满足需要,将设置heap ...

  5. iframe 问题集合

    1. 历史记录问题 Firefox: 如果iframe是静态存在在HTML中时,iframe的任何src或者location改变都会被记录到浏览器history中. 如果iframe是在页面加载完成后 ...

  6. Linux Mint KDE上安装fcitx+sougou输入法

    今天在韩总废弃的笔记本上安装了Linux Mint系统,装好之后第一件想到的事情就是安装个输入法,由于之前系统自带的输入法框架是ibus,我试用了一下发现很不人性化,所以决定换上fcitx+sougo ...

  7. CentOs下mysql-5.6.39-linux-glibc2.12-x86_64.tar.gz压缩包的安装

    之前写过一篇mysql在windows下的安装(猛击这儿),linux下用的比较少,最近切换到linux服务器了,发行mysql安装和windows下有所不同,只记录压缩包方式安装,rpm包类似 1. ...

  8. 一次delete基表回收DBA权限的危险性操作

    1.0事件还原:测试库某个对象,使用具有DBA角色用户导出,生产环境普通用户无法导入数据,因此需要回收测试库dba角色,revoke无法回收 2.0操作流程 回收角色报错 测试环境测试,delete删 ...

  9. [LeetCode&Python] Problem 832. Flipping an Image

    Given a binary matrix A, we want to flip the image horizontally, then invert it, and return the resu ...

  10. 了解 .NET 的默认 TaskScheduler 和线程池(ThreadPool)设置,避免让 Task.Run 的性能急剧降低

    .NET Framework 4.5 开始引入 Task.Run,它可以很方便的帮助我们使用 async / await 语法,同时还使用线程池来帮助我们管理线程.以至于我们编写异步代码可以像编写同步 ...