【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.30200101112
String 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简介 先分析这么一个场景:当我们在网站上购物时,必须经过,下订单.发票创建.付款处理.订单履行.航运等.但是,当用户下单后,立即跳转到“感谢那您的订单” 页面.不仅如此,若果没有延 ...
随机推荐
- 往SD卡中写文件的方法。
package com.lixu.writetosd; import java.io.File; import java.io.FileOutputStream; import java.io.IOE ...
- 面试题2:单例模式Singleton
首先,单例模式使类在程序生命周期的任何时刻都只有一个实例, 然后,单例的构造函数是私有的,外部程序如果想要访问这个单例类的话, 必须通过 getInstance()来请求(注意是请求)得到这个单例类的 ...
- hibernate一对一关联
hibernate一对一主键关联 一对一主键关联指的是两个表通过主键形成的一对一映射. 数据表要求:A表的主键也是B表的主键同时B表的主键也是A表的外键 sql: create table peopl ...
- 项目使用Nuget,然后SVN checkout后显示缺少引用
如下图黄色叹号: 解决方案: 1.先生成解决方案 2.执行如下: 这时候Nuget是存在了,但是还是显示缺少引用: 那么最后一步, 输入 :Update-Package -reinstall
- SharePoint 2013的100个新功能之内容管理(一)
一:拖拽 现在在任意的文档库中,你可以拖拽文档到文档库区域,它会以进度条显示上传到文档库中.第一步鼠标点击文档拖动到文档库区域时,它会变成"拖到此处",第二步放开鼠标,上传. 二: ...
- MySQL错误代码
常见: 1005:创建表失败 1006:创建数据库失败 1007:数据库已存在,创建数据库失败 1008:数据库不存在,删除数据库失败 1009:不能删除数据库文件导致删除数据库失败 1010:不能删 ...
- linux-*.filetype.bz2 unzip
how to unzip *.bz2 file? wget http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2 unzip ...
- socket can demo
http://www.cnblogs.com/zengjfgit/p/5327689.html
- 自动化工具-jenkins
jenkins自动化工具使用教程 自动化构建.测试.部署.代码检测越来越重要.主要有一下几点原因 企业做大,项目变多,多端支持(web,h5,小程序等) 微服务提倡高内聚低耦合,项目因拆分变多 Dev ...
- 在windows下制作mac os x的启动安装U盘
前几天有幸用了下Macbook pro,可在给它装win 7系统时,无知而又手贱地在windows系统下分区了:( 然后再重启就找不到Mac os x,只有win 7了.可进win 7也不正常,直接给 ...