ActiveMQ订阅模式持久化实现
实现步骤:
1、配置发送xml,applicationContext-send.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:context="http://www.springframework.org/schema/context"
 - xsi:schemaLocation="http://www.springframework.org/schema/beans
 - http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
 - http://www.springframework.org/schema/context
 - http://www.springframework.org/schema/context/spring-context-2.5.xsd">
 - <context:property-placeholder location="classpath:/properties/jms.properties" />
 - <!-- 配置JMS连接工厂 -->
 - <bean id="myConnectionFactory"
 - class="org.springframework.jms.connection.CachingConnectionFactory">
 - <!-- Session缓存数量 -->
 - <property name="sessionCacheSize" value="10" />
 - <property name="targetConnectionFactory">
 - <bean class="org.apache.activemq.ActiveMQConnectionFactory">
 - <!-- MQ地址 -->
 - <property name="brokerURL" value="${brokerUrl}" />
 - <!-- 是否异步发送 -->
 - <property name="useAsyncSend" value="true" />
 - </bean>
 - </property>
 - </bean>
 - <!-- 发送消息的目的地(一个主题) -->
 - <bean id="myDestination" class="org.apache.activemq.command.ActiveMQTopic">
 - <!-- 设置消息主题的名字 -->
 - <constructor-arg index="0" value="${send.name}" />
 - </bean>
 - <!-- 配置JMS模版 -->
 - <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
 - <property name="connectionFactory" ref="myConnectionFactory" />
 - <property name="defaultDestination" ref="myDestination" />
 - <!-- 订阅发布模式 -->
 - <property name="pubSubDomain" value="true" />
 - <property name="receiveTimeout" value="10000" />
 - </bean>
 - </beans>
 
2、编写发送java,ActiveMQsender.java
- package com.by.activeMQ;
 - import javax.jms.JMSException;
 - import javax.jms.Message;
 - import javax.jms.Session;
 - import javax.jms.TextMessage;
 - import org.springframework.context.ApplicationContext;
 - import org.springframework.context.support.ClassPathXmlApplicationContext;
 - import org.springframework.jms.core.JmsTemplate;
 - import org.springframework.jms.core.MessageCreator;
 - public class ActiveMQsender {
 - public static void main(String[] args) {
 - @SuppressWarnings("resource")
 - ApplicationContext ctx = new ClassPathXmlApplicationContext(
 - "ApplicationContext/applicationContext-send.xml");
 - JmsTemplate jmsTemplate = (JmsTemplate) ctx.getBean("jmsTemplate");
 - jmsTemplate.send(new MessageCreator() {
 - public Message createMessage(Session session) throws JMSException {
 - TextMessage msg = session.createTextMessage();
 - // 设置消息属性
 - msg.setStringProperty("mood", "happy");
 - // 设置消息内容
 - msg.setText("Hello World!");
 - return msg;
 - }
 - });
 - System.out.println("send end");
 - }
 - }
 
3、配置接收xml,applicationContext-receive.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:context="http://www.springframework.org/schema/context"
 - xsi:schemaLocation="http://www.springframework.org/schema/beans
 - http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
 - http://www.springframework.org/schema/context
 - http://www.springframework.org/schema/context/spring-context-2.5.xsd">
 - <context:property-placeholder location="classpath:/properties/jms.properties" />
 - <!-- 第一个接收者 -->
 - <!-- 配置JMS连接工厂 -->
 - <bean id="myConnectionFactory"
 - class="org.springframework.jms.connection.CachingConnectionFactory">
 - <!-- Session缓存数量 -->
 - <property name="sessionCacheSize" value="10" />
 - <!-- 接收者ID -->
 - <property name="clientId" value="${topic.clientId}" />
 - <property name="targetConnectionFactory">
 - <bean class="org.apache.activemq.ActiveMQConnectionFactory">
 - <!-- MQ地址 -->
 - <property name="brokerURL" value="${brokerUrl}" />
 - </bean>
 - </property>
 - </bean>
 - <!-- 发送消息的目的地(一个主题) -->
 - <bean id="myDestination" class="org.apache.activemq.command.ActiveMQTopic">
 - <!-- 设置消息主题的名字 -->
 - <constructor-arg index="0" value="${topic.name}" />
 - </bean>
 - <!-- 生产消息配置 (自己定义)-->
 - <bean id="myTopicConsumer" class="com.by.activeMQ.ActiveMQreceiver" />
 - <!-- 消息监听器 -->
 - <bean id="myTopicListener"
 - class="org.springframework.jms.listener.adapter.MessageListenerAdapter">
 - <constructor-arg ref="myTopicConsumer" />
 - <!-- 接收消息的方法名称 -->
 - <property name="defaultListenerMethod" value="receive" />
 - <!-- 不进行消息转换 -->
 - <property name="messageConverter"><null/></property>
 - </bean>
 - <!-- 消息监听容器 -->
 - <bean id="myListenerContainer"
 - class="org.springframework.jms.listener.DefaultMessageListenerContainer">
 - <property name="connectionFactory" ref="myConnectionFactory" />
 - <!-- 发布订阅模式 -->
 - <property name="pubSubDomain" value="true"/>
 - <!-- 消息持久化 -->
 - <property name="subscriptionDurable" value="true"/>
 - <property name="receiveTimeout" value="10"/>
 - <!-- 接收者ID -->
 - <property name="clientId" value="${topic.clientId}" />
 - <property name="durableSubscriptionName" value="${topic.clientId}"/>
 - <property name="destination" ref="myDestination" />
 - <property name="messageListener" ref="myTopicListener" />
 - </bean>
 - <!-- 第二个接收者 -->
 - <!-- 配置JMS连接工厂 -->
 - <bean id="myConnectionFactory2"
 - class="org.springframework.jms.connection.CachingConnectionFactory">
 - <!-- Session缓存数量 -->
 - <property name="sessionCacheSize" value="10" />
 - <!-- 接收者ID -->
 - <property name="clientId" value="${topic2.clientId}" />
 - <property name="targetConnectionFactory">
 - <bean class="org.apache.activemq.ActiveMQConnectionFactory">
 - <!-- MQ地址 -->
 - <property name="brokerURL" value="${brokerUrl}" />
 - </bean>
 - </property>
 - </bean>
 - <!-- 发送消息的目的地(一个主题) -->
 - <bean id="myDestination2" class="org.apache.activemq.command.ActiveMQTopic">
 - <!-- 设置消息主题的名字 -->
 - <constructor-arg index="0" value="${topic2.name}" />
 - </bean>
 - <!-- 生产消息配置 (自己定义)-->
 - <bean id="myTopicConsumer2" class="com.by.activeMQ.ActiveMQreceiver2" />
 - <!-- 消息监听器 -->
 - <bean id="myTopicListener2"
 - class="org.springframework.jms.listener.adapter.MessageListenerAdapter">
 - <constructor-arg ref="myTopicConsumer2" />
 - <!-- 接收消息的方法名称 -->
 - <property name="defaultListenerMethod" value="receive" />
 - <!-- 不进行消息转换 -->
 - <property name="messageConverter"><null/></property>
 - </bean>
 - <!-- 消息监听容器 -->
 - <bean id="myListenerContainer2"
 - class="org.springframework.jms.listener.DefaultMessageListenerContainer">
 - <property name="connectionFactory" ref="myConnectionFactory2" />
 - <!-- 发布订阅模式 -->
 - <property name="pubSubDomain" value="true"/>
 - <!-- 消息持久化 -->
 - <property name="subscriptionDurable" value="true"/>
 - <property name="receiveTimeout" value="10"/>
 - <!-- 接收者ID -->
 - <property name="clientId" value="${topic2.clientId}" />
 - <property name="durableSubscriptionName" value="${topic2.clientId}"/>
 - <property name="destination" ref="myDestination2" />
 - <property name="messageListener" ref="myTopicListener2" />
 - </bean>
 - </beans>
 
4、编写接收java,ActiveMQreceiver.java
- package com.by.activeMQ;
 - import javax.jms.JMSException;
 - import javax.jms.TextMessage;
 - import org.springframework.jms.JmsException;
 - public class ActiveMQreceiver {
 - public void receive(TextMessage message) throws JmsException, JMSException {
 - String info = "this is receiver, "
 - + " mood is " + message.getStringProperty("mood") + ","
 - + "say " + message.getText();
 - System.out.println(info);
 - }
 - }
 
5、编写另一个接收java,ActiveMQreceiver.java
- package com.by.activeMQ;
 - import javax.jms.JMSException;
 - import javax.jms.TextMessage;
 - import org.springframework.jms.JmsException;
 - public class ActiveMQreceiver2 {
 - public void receive(TextMessage message) throws JmsException, JMSException {
 - String info = "this is receiver2,"
 - + " mood is " + message.getStringProperty("mood") + ","
 - + "say " + message.getText();
 - System.out.println(info);
 - }
 - }
 
6、编写一个main,开启接收监听,openReceive.java
- package com.by.activeMQ;
 - import org.springframework.context.ApplicationContext;
 - import org.springframework.context.support.ClassPathXmlApplicationContext;
 - public class openReceive {
 - public static void main(String[] args) {
 - @SuppressWarnings({ "unused", "resource" })
 - ApplicationContext ctx = new ClassPathXmlApplicationContext("ApplicationContext/applicationContext-receive.xml");
 - while(true) {
 - }
 - }
 - }
 
7、编写一个配置文件,jms.properties
- #send
 - send.name=Topic_Mood
 - #receive
 - topic.name=Topic_Mood
 - topic.clientId=client_LiLei
 - topic2.name=Topic_Mood
 - topic2.clientId=client_HanMei
 - #url
 - brokerUrl=failover:(tcp://10.0.0.232:61616)?initialReconnectDelay=1000
 
8、pom里面添加activeMQ的依赖
- <dependency>
 - <groupId>org.apache.activemq</groupId>
 - <artifactId>activemq-pool</artifactId>
 - <version>5.11.1</version>
 - </dependency>
 - <dependency>
 - <groupId>org.apache.commons</groupId>
 - <artifactId>commons-pool2</artifactId>
 - <version>2.3</version>
 - </dependency>
 - <dependency>
 - <groupId>org.springframework</groupId>
 - <artifactId>spring-jms</artifactId>
 - <version>4.0.0.RELEASE</version>
 - </dependency>
 - <dependency>
 - <groupId>org.apache.activemq</groupId>
 - <artifactId>activemq-all</artifactId>
 - <version>5.11.1</version>
 - </dependency>
 
耶,运行就ok了。
发送消息的输出是这样的:
- 2016-08-05 11:27:19 [ main:0 ] - [ INFO ] Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@16011db4: startup date [Fri Aug 05 11:27:19 CST 2016]; root of context hierarchy
 - 2016-08-05 11:27:19 [ main:31 ] - [ INFO ] Loading XML bean definitions from class path resource [ApplicationContext/applicationContext-send.xml]
 - 2016-08-05 11:27:19 [ main:187 ] - [ INFO ] Loading properties file from class path resource [properties/jms.properties]
 - 2016-08-05 11:27:19 [ main:392 ] - [ INFO ] Established shared JMS Connection: ActiveMQConnection {id=ID:MDG42V9PSU28IKA-60542-1470367639797-1:1,clientId=null,started=false}
 - 2016-08-05 11:27:19 [ ActiveMQ Task-1:467 ] - [ INFO ] Successfully connected to tcp://10.0.0.232:61616
 - send end
 
接收消息的输出是这样的:
- 2016-08-05 11:28:04 [ ActiveMQ Task-1:490 ] - [ INFO ] Successfully connected to tcp://10.0.0.232:61616
 - 2016-08-05 11:28:04 [ main:498 ] - [ INFO ] Established shared JMS Connection: ActiveMQConnection {id=ID:MDG42V9PSU28IKA-60544-1470367684739-1:1,clientId=client_LiLei,started=false}
 - 2016-08-05 11:28:04 [ ActiveMQ Task-1:504 ] - [ INFO ] Successfully connected to tcp://10.0.0.232:61616
 - 2016-08-05 11:28:04 [ main:509 ] - [ INFO ] Established shared JMS Connection: ActiveMQConnection {id=ID:MDG42V9PSU28IKA-60544-1470367684739-3:1,clientId=client_HanMei,started=false}
 - this is receiver2, mood is happy,say Hello World!
 - this is receiver, mood is happy,say Hello World!
 
配置另一个接收者就是,把第一个接收者的配置复制,然后添加个2,再把接收类复制,添加个2,就搞定了。这种方式也适用于mongodb啊这种配置。在一个工程里面操作两个mongodb数据库。
ActiveMQ订阅模式持久化实现的更多相关文章
- ACtiveMQ中间件-发布订阅模式
		
前言:ActiveMQ学习心得 1.MQ是什么 MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过读写出入队列的消息(针对应用程序的数据)来通信, ...
 - ActiveMQ的p2p模式与发布订阅模式
		
1.消息中间件:采用异步通讯防止,支持点对点以及发布订阅模式,可以解决高并发问题 传统调用接口,可能发生阻塞,重复提交,超时等等问题,可以利用消息中间件发送异步通讯请求 ...
 - ActiveMQ发布订阅模式
		
ActiveMQ的另一种模式就SUB/HUB即发布订阅模式,是SUB/hub就是一拖N的USB分线器的意思.意思就是一个来源分到N个出口.还是上节的例子,当一个订单产生后,后台N个系统需要联动,但有一 ...
 - ActiveMQ发布订阅模式(转)
		
ActiveMQ的另一种模式就SUB/HUB即发布订阅模式,是SUB/hub就是一拖N的USB分线器的意思.意思就是一个来源分到N个出口.还是上节的例子,当一个订单产生后,后台N个系统需要联动,但有一 ...
 - ActiveMQ (二)—发布订阅模式
		
ActiveMQ的另一种模式就SUB/HUB即发布订阅模式,是SUB/hub就是一拖N的USB分线器的意思.意思就是一个来源分到N个出口.还是上节的例子,当一个订单产生后,后台N个系统需要联动,但有一 ...
 - ActiveMQ发布订阅模式  转发 https://www.cnblogs.com/madyina/p/4127144.html
		
ActiveMQ的另一种模式就SUB/HUB即发布订阅模式,是SUB/hub就是一拖N的USB分线器的意思.意思就是一个来源分到N个出口.还是上节的例子,当一个订单产生后,后台N个系统需要联动,但有一 ...
 - SpringBoot2.0之整合ActiveMQ(发布订阅模式)
		
发布订阅模式与前面的点对点模式很类似,简直一毛一样 注意:发布订阅模式 先启动消费者 公用pom: <project xmlns="http://maven.apache.org/PO ...
 - ActiveMQ入门系列三:发布/订阅模式
		
在上一篇<ActiveMQ入门系列二:入门代码实例(点对点模式)>中提到了ActiveMQ中的两种模式:点对点模式(PTP)和发布/订阅模式(Pub & Sub),详细介绍了点对点 ...
 - redis实现消息队列&发布/订阅模式使用
		
在项目中用到了redis作为缓存,再学习了ActiveMq之后想着用redis实现简单的消息队列,下面做记录. Redis的列表类型键可以用来实现队列,并且支持阻塞式读取,可以很容易的实现一个高性 ...
 
随机推荐
- ios 安卓 video 取消播放自动全屏 属性
			
x-webkit-airplay="true",x5-playsinline="true",webkit-playsinline="true" ...
 - 通过javascript进行UTF-8编码
			
通过javascript进行UTF-8编码 javascript的字符集: javascript程序是使用Unicode字符集编写的.Unicode是ASCII和Latin-1的超集,并支持地球上几乎 ...
 - 编写简单的spring mvc程序,在tomcat上部署
			
编写简单的spring mvc程序,在tomcat上部署 1 用java 配置spring mvc ,可以省去web.xmlpackage hello;import org.springframewo ...
 - VS2015运行 cordova 时候提示无法运行解决
			
出现此问题的原因是在于npm程序损坏了.vs调用的npm程序并不是在node安装目录下的npm,而是在: C:\Users\用户名\AppData\Roaming\Microsoft\VisualSt ...
 - Codeforces 429 B. Working out-dp(  Codeforces Round #245 (Div. 1))
			
B. Working out time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...
 - 读书笔记(高性能javascript)(二)
			
5. 字符串和正则表达式: (1) 在大多数浏览器中,数组项合并(Array.prototype.join)比其他字符串连接方法更慢,但它却在IE7及更早版本浏览器中合并大量字符串唯一高效的途径: ( ...
 - CentOS中Ctrl+Z、Ctrl+C、Ctrl+D的区别
			
Ctrl+C和Ctrl+Z都是中断命令,但作用不同. Ctrl+C是发送SIGINT信号,终止一个进程. Ctrl+Z是发送SIGSTOP信号,挂起一个进程,将作业放置到后台(暂停状态).与此同时,可 ...
 - CSU - 1334 -好老师(STL-map用法)
			
https://cn.vjudge.net/contest/157163#problem/E #include<map> #include<queue> #include< ...
 - 【推导】【构造】Petrozavodsk Summer Training Camp 2015 Day 2: Xudyh (TooSimple) Contest, Saturday, August 22, 2015 Problem G. Travelling Salesman Problem
			
一个矩阵,每个位置有一个非负整数,一个人从左上走到右下,不能走重复的格子,问得到的最大权值. 当长宽不都为偶数时,必然能走遍所有格子,横着从左到右,从右到左(或是竖着走)走完即可. 当长宽都是偶数时, ...
 - 【动态规划去除冗余】NOIP2010-乌龟棋
			
[题目大意] [思路] 最简单的思路是五维数组,但是当前走到的步数由已经取到的卡片决定,所以只需要四维.本来想要改一个滚动数组的,但是好像没有滚起来,算了(ノ`Д)ノ. 在学校要晚自习到21:15,回 ...