ActiveMQ订阅模式持久化实现

实现步骤:
1、配置发送xml,applicationContext-send.xml

[html] view plain copy

  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:context="http://www.springframework.org/schema/context"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
  6. http://www.springframework.org/schema/context
  7. http://www.springframework.org/schema/context/spring-context-2.5.xsd">
  8. <context:property-placeholder location="classpath:/properties/jms.properties" />
  9. <!-- 配置JMS连接工厂 -->
  10. <bean id="myConnectionFactory"
  11. class="org.springframework.jms.connection.CachingConnectionFactory">
  12. <!-- Session缓存数量 -->
  13. <property name="sessionCacheSize" value="10" />
  14. <property name="targetConnectionFactory">
  15. <bean class="org.apache.activemq.ActiveMQConnectionFactory">
  16. <!-- MQ地址 -->
  17. <property name="brokerURL" value="${brokerUrl}" />
  18. <!-- 是否异步发送 -->
  19. <property name="useAsyncSend" value="true" />
  20. </bean>
  21. </property>
  22. </bean>
  23. <!-- 发送消息的目的地(一个主题) -->
  24. <bean id="myDestination" class="org.apache.activemq.command.ActiveMQTopic">
  25. <!-- 设置消息主题的名字 -->
  26. <constructor-arg index="0" value="${send.name}" />
  27. </bean>
  28. <!-- 配置JMS模版 -->
  29. <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
  30. <property name="connectionFactory" ref="myConnectionFactory" />
  31. <property name="defaultDestination" ref="myDestination" />
  32. <!-- 订阅发布模式 -->
  33. <property name="pubSubDomain" value="true" />
  34. <property name="receiveTimeout" value="10000" />
  35. </bean>
  36. </beans>

2、编写发送java,ActiveMQsender.java

[java] view plain copy

  1. package com.by.activeMQ;
  2. import javax.jms.JMSException;
  3. import javax.jms.Message;
  4. import javax.jms.Session;
  5. import javax.jms.TextMessage;
  6. import org.springframework.context.ApplicationContext;
  7. import org.springframework.context.support.ClassPathXmlApplicationContext;
  8. import org.springframework.jms.core.JmsTemplate;
  9. import org.springframework.jms.core.MessageCreator;
  10. public class ActiveMQsender {
  11. public static void main(String[] args) {
  12. @SuppressWarnings("resource")
  13. ApplicationContext ctx = new ClassPathXmlApplicationContext(
  14. "ApplicationContext/applicationContext-send.xml");
  15. JmsTemplate jmsTemplate = (JmsTemplate) ctx.getBean("jmsTemplate");
  16. jmsTemplate.send(new MessageCreator() {
  17. public Message createMessage(Session session) throws JMSException {
  18. TextMessage msg = session.createTextMessage();
  19. // 设置消息属性
  20. msg.setStringProperty("mood", "happy");
  21. // 设置消息内容
  22. msg.setText("Hello World!");
  23. return msg;
  24. }
  25. });
  26. System.out.println("send end");
  27. }
  28. }

3、配置接收xml,applicationContext-receive.xml

[html] view plain copy

  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:context="http://www.springframework.org/schema/context"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
  6. http://www.springframework.org/schema/context
  7. http://www.springframework.org/schema/context/spring-context-2.5.xsd">
  8. <context:property-placeholder location="classpath:/properties/jms.properties" />
  9. <!-- 第一个接收者 -->
  10. <!-- 配置JMS连接工厂 -->
  11. <bean id="myConnectionFactory"
  12. class="org.springframework.jms.connection.CachingConnectionFactory">
  13. <!-- Session缓存数量 -->
  14. <property name="sessionCacheSize" value="10" />
  15. <!-- 接收者ID -->
  16. <property name="clientId" value="${topic.clientId}" />
  17. <property name="targetConnectionFactory">
  18. <bean class="org.apache.activemq.ActiveMQConnectionFactory">
  19. <!-- MQ地址 -->
  20. <property name="brokerURL" value="${brokerUrl}" />
  21. </bean>
  22. </property>
  23. </bean>
  24. <!-- 发送消息的目的地(一个主题) -->
  25. <bean id="myDestination" class="org.apache.activemq.command.ActiveMQTopic">
  26. <!-- 设置消息主题的名字 -->
  27. <constructor-arg index="0" value="${topic.name}" />
  28. </bean>
  29. <!-- 生产消息配置 (自己定义)-->
  30. <bean id="myTopicConsumer" class="com.by.activeMQ.ActiveMQreceiver" />
  31. <!-- 消息监听器 -->
  32. <bean id="myTopicListener"
  33. class="org.springframework.jms.listener.adapter.MessageListenerAdapter">
  34. <constructor-arg ref="myTopicConsumer" />
  35. <!-- 接收消息的方法名称 -->
  36. <property name="defaultListenerMethod" value="receive" />
  37. <!-- 不进行消息转换 -->
  38. <property name="messageConverter"><null/></property>
  39. </bean>
  40. <!-- 消息监听容器 -->
  41. <bean id="myListenerContainer"
  42. class="org.springframework.jms.listener.DefaultMessageListenerContainer">
  43. <property name="connectionFactory" ref="myConnectionFactory" />
  44. <!-- 发布订阅模式 -->
  45. <property name="pubSubDomain" value="true"/>
  46. <!-- 消息持久化 -->
  47. <property name="subscriptionDurable" value="true"/>
  48. <property name="receiveTimeout" value="10"/>
  49. <!-- 接收者ID -->
  50. <property name="clientId" value="${topic.clientId}" />
  51. <property name="durableSubscriptionName" value="${topic.clientId}"/>
  52. <property name="destination" ref="myDestination" />
  53. <property name="messageListener" ref="myTopicListener" />
  54. </bean>
  55. <!-- 第二个接收者 -->
  56. <!-- 配置JMS连接工厂 -->
  57. <bean id="myConnectionFactory2"
  58. class="org.springframework.jms.connection.CachingConnectionFactory">
  59. <!-- Session缓存数量 -->
  60. <property name="sessionCacheSize" value="10" />
  61. <!-- 接收者ID -->
  62. <property name="clientId" value="${topic2.clientId}" />
  63. <property name="targetConnectionFactory">
  64. <bean class="org.apache.activemq.ActiveMQConnectionFactory">
  65. <!-- MQ地址 -->
  66. <property name="brokerURL" value="${brokerUrl}" />
  67. </bean>
  68. </property>
  69. </bean>
  70. <!-- 发送消息的目的地(一个主题) -->
  71. <bean id="myDestination2" class="org.apache.activemq.command.ActiveMQTopic">
  72. <!-- 设置消息主题的名字 -->
  73. <constructor-arg index="0" value="${topic2.name}" />
  74. </bean>
  75. <!-- 生产消息配置 (自己定义)-->
  76. <bean id="myTopicConsumer2" class="com.by.activeMQ.ActiveMQreceiver2" />
  77. <!-- 消息监听器 -->
  78. <bean id="myTopicListener2"
  79. class="org.springframework.jms.listener.adapter.MessageListenerAdapter">
  80. <constructor-arg ref="myTopicConsumer2" />
  81. <!-- 接收消息的方法名称 -->
  82. <property name="defaultListenerMethod" value="receive" />
  83. <!-- 不进行消息转换 -->
  84. <property name="messageConverter"><null/></property>
  85. </bean>
  86. <!-- 消息监听容器 -->
  87. <bean id="myListenerContainer2"
  88. class="org.springframework.jms.listener.DefaultMessageListenerContainer">
  89. <property name="connectionFactory" ref="myConnectionFactory2" />
  90. <!-- 发布订阅模式 -->
  91. <property name="pubSubDomain" value="true"/>
  92. <!-- 消息持久化 -->
  93. <property name="subscriptionDurable" value="true"/>
  94. <property name="receiveTimeout" value="10"/>
  95. <!-- 接收者ID -->
  96. <property name="clientId" value="${topic2.clientId}" />
  97. <property name="durableSubscriptionName" value="${topic2.clientId}"/>
  98. <property name="destination" ref="myDestination2" />
  99. <property name="messageListener" ref="myTopicListener2" />
  100. </bean>
  101. </beans>

4、编写接收java,ActiveMQreceiver.java

[java] view plain copy

  1. package com.by.activeMQ;
  2. import javax.jms.JMSException;
  3. import javax.jms.TextMessage;
  4. import org.springframework.jms.JmsException;
  5. public class ActiveMQreceiver {
  6. public void receive(TextMessage message) throws JmsException, JMSException {
  7. String info = "this is receiver, "
  8. + " mood is " + message.getStringProperty("mood") + ","
  9. + "say " + message.getText();
  10. System.out.println(info);
  11. }
  12. }

5、编写另一个接收java,ActiveMQreceiver.java

[java] view plain copy

  1. package com.by.activeMQ;
  2. import javax.jms.JMSException;
  3. import javax.jms.TextMessage;
  4. import org.springframework.jms.JmsException;
  5. public class ActiveMQreceiver2 {
  6. public void receive(TextMessage message) throws JmsException, JMSException {
  7. String info = "this is receiver2,"
  8. + " mood is " + message.getStringProperty("mood") + ","
  9. + "say " + message.getText();
  10. System.out.println(info);
  11. }
  12. }

6、编写一个main,开启接收监听,openReceive.java

[java] view plain copy

  1. package com.by.activeMQ;
  2. import org.springframework.context.ApplicationContext;
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;
  4. public class openReceive {
  5. public static void main(String[] args) {
  6. @SuppressWarnings({ "unused", "resource" })
  7. ApplicationContext ctx = new ClassPathXmlApplicationContext("ApplicationContext/applicationContext-receive.xml");
  8. while(true) {
  9. }
  10. }
  11. }

7、编写一个配置文件,jms.properties

[plain] view plain copy

  1. #send
  2. send.name=Topic_Mood
  3. #receive
  4. topic.name=Topic_Mood
  5. topic.clientId=client_LiLei
  6. topic2.name=Topic_Mood
  7. topic2.clientId=client_HanMei
  8. #url
  9. brokerUrl=failover:(tcp://10.0.0.232:61616)?initialReconnectDelay=1000

8、pom里面添加activeMQ的依赖

[html] view plain copy

  1. <dependency>
  2. <groupId>org.apache.activemq</groupId>
  3. <artifactId>activemq-pool</artifactId>
  4. <version>5.11.1</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.apache.commons</groupId>
  8. <artifactId>commons-pool2</artifactId>
  9. <version>2.3</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.springframework</groupId>
  13. <artifactId>spring-jms</artifactId>
  14. <version>4.0.0.RELEASE</version>
  15. </dependency>
  16. <dependency>
  17. <groupId>org.apache.activemq</groupId>
  18. <artifactId>activemq-all</artifactId>
  19. <version>5.11.1</version>
  20. </dependency>

耶,运行就ok了。
发送消息的输出是这样的:

[plain] view plain copy

  1. 2016-08-05 11:27:19 [ main:0 ] - [ INFO ] Refreshing org[email protected]16011db4: startup date [Fri Aug 05 11:27:19 CST 2016]; root of context hierarchy
  2. 2016-08-05 11:27:19 [ main:31 ] - [ INFO ] Loading XML bean definitions from class path resource [ApplicationContext/applicationContext-send.xml]
  3. 2016-08-05 11:27:19 [ main:187 ] - [ INFO ] Loading properties file from class path resource [properties/jms.properties]
  4. 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}
  5. 2016-08-05 11:27:19 [ ActiveMQ Task-1:467 ] - [ INFO ] Successfully connected to tcp://10.0.0.232:61616
  6. send end

接收消息的输出是这样的:

[plain] view plain copy

  1. 2016-08-05 11:28:04 [ ActiveMQ Task-1:490 ] - [ INFO ] Successfully connected to tcp://10.0.0.232:61616
  2. 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}
  3. 2016-08-05 11:28:04 [ ActiveMQ Task-1:504 ] - [ INFO ] Successfully connected to tcp://10.0.0.232:61616
  4. 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}
  5. this is receiver2, mood is happy,say Hello World!
  6. this is receiver,  mood is happy,say Hello World!

配置另一个接收者就是,把第一个接收者的配置复制,然后添加个2,再把接收类复制,添加个2,就搞定了。这种方式也适用于mongodb啊这种配置。在一个工程里面操作两个mongodb数据库。

时间: 2024-11-02 02:28:22

ActiveMQ订阅模式持久化实现的相关文章

ActiveMQ简单简绍(“点对点通讯”和 “发布订阅模式”)

ActiveMQ简单简绍 MQ简介: MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过写和检索出入列队的针对应用程序的数据(消息)来通信,而无需专用连接来链接它们.消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术.排队指的是应用程序通过队列来通信.队列的使用除去了接收和发送应用程序同时执行的要求.其中较为成熟的MQ产品有IBMWEBSPHERE MQ. MQ特点: M

ActiveMQ发布订阅模式

ActiveMQ的另一种模式就SUB/HUB即发布订阅模式,是SUB/hub就是一拖N的USB分线器的意思.意思就是一个来源分到N个出口.还是上节的例子,当一个订单产生后,后台N个系统需要联动,但有一个前提是都需要收到订单信息,那么我们就需要将一个生产者的消息发布到N个消费者. 生产者: try { //Create the Connection Factory IConnectionFactory factory = new ConnectionFactory("tcp://localhost

ActiveMQ入门系列三:发布/订阅模式

在上一篇<ActiveMQ入门系列二:入门代码实例(点对点模式)>中提到了ActiveMQ中的两种模式:点对点模式(PTP)和发布/订阅模式(Pub & Sub),详细介绍了点对点模式并用代码实例进行说明,今天就介绍下发布/订阅模式. 一.理论基础 发布/订阅模式的工作示意图: 消息生产者将消息(发布)到topic中,可以同时有多个消息消费者(订阅)消费该消息. 和点对点方式不同,发布到topic的消息会被所有订阅者消费. 当生产者发布消息,不管是否有消费者,都不会保存消息. 一定要先

架构设计:系统存储(16)——Redis事件订阅和持久化存储

接上文<架构设计:系统存储(15)--Redis基本概念和安装使用> 3-4.事件功能和配置项 Redis从2.X版本开始,就支持一种基于非持久化消息的.使用发布/订阅模式实现的事件通知机制.所谓基于非连接保持,是因为一旦消息订阅者由于各种异常情况而被迫断开连接,在其重新连接后,其离线期间的事件是无法被重新通知的(一些Redis资料中也称为即发即弃).而其使用的发布/订阅模式,意味着其机制并不是由订阅者周期性的从Redis服务拉取事件通知,而是由Redis服务主动推送事件通知到符合条件的若干订

JMS学习八(ActiveMQ的消息持久化到Mysql数据库)

1.将连接Mysql数据库的jar文件,放到ActiveMQ的lib目录下 2.修改ActiveMQ的conf目录下的active.xml文件,修改数据持久化的方式 2.1  修改原来的kshadb的持久化数据的方式 <persistenceAdapter> <!-- <kahaDB directory="${activemq.data}/kahadb"/> --> <jdbcPersistenceAdapter dataSource=&quo

RabbitMQ/JAVA (发布/订阅模式)

发布/订阅模式即生产者将消息发送给多个消费者. 下面介绍几个在发布/订阅模式中的关键概念-- 1. Exchanges (转发器) 可能原来我们都是基于一个队列发送和接收消息.现在介绍一下完整的消息传递模式. Rabbitmq消息模式的核心理念是:生产者没有直接发送任何消息到队列.实际上,生产者都不知道这个消息是发送给哪个队列的.相反,生产者只能发送消息给转发器. 转发器一方面接收生产者的消息,另一方面向队列推送消息. 转发器必须清楚的指导如何处理接收到的消息,需要附加队列吗?附加几个?或者是否

Redis研究(十六)—发布/订阅模式

在上一篇中我们写了Redis的任务队列. 除了实现任务队列外,Redis还提供了一组命令可以让开发者实现"发布/订阅"(publish/subscribe)模式."发布/订阅"模式同样可以实现进程间的消息传递,其原理是这样的: "发布/订阅"模式中包含两种角色,分别是发布者和订阅者.订阅者可以订阅一个或若干个频道(channel),而发布者可以向指定的频道发送消息,所有订阅此频道的订阅者都会收到此消息. 发布者发布消息的命令是PUBLISH,用法

ActiveMQ的消息持久化机制

为了避免意外宕机以后丢失信息,需要做到重启后可以恢复消息队列,消息系统一般都会采用持久化机制. ActiveMQ的消息持久化机制有JDBC,AMQ,KahaDB和LevelDB,无论使用哪种持久化方式,消息的存储逻辑都是一致的. 就是在发送者将消息发送出去后,消息中心首先将消息存储到本地数据文件.内存数据库或者远程数据库等,然后试图将消息发送给接收者,发送成功则将消息从存储中删除,失败则继续尝试. 消息中心启动以后首先要检查指定的存储位置,如果有未发送成功的消息,则需要把消息发送出去. 1. J

Redis事件订阅和持久化存储

http://blog.csdn.net/yinwenjie/article/details/53518286 Redis从2.X版本开始,就支持一种基于非持久化消息的.使用发布/订阅模式实现的事件通知机制.所谓基于非连接保持,是因为一旦消息订阅者由于各种异常情况而被迫断开连接,在其重新连接后,其离线期间的事件是无法被重新通知的(一些Redis资料中也称为即发即弃).而其使用的发布/订阅模式,意味着其机制并不是由订阅者周期性的从Redis服务拉取事件通知,而是由Redis服务主动推送事件通知到符