使用Spring來配置ActiveMQ的消息訂閱發佈,消息持久化
發送者的配置:
- <?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">
- <!-- 配置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="failover:(tcp://127.0.0.1:61616,tcp://127.0.0.1:61617)?randomize=false" />
- <!-- 是否異步發送 -->
- <property name="useAsyncSend" value="false" />
- </bean>
- </property>
- </bean>
- <!-- 發送消息的目的地(一個主題) -->
- <bean id="myDestination" class="org.apache.activemq.command.ActiveMQTopic">
- <!-- 設置消息主題的名字 -->
- <constructor-arg index="0" value="Online.Notice.Topic" />
- </bean>
- <!-- 配置JMS模版 -->
- <bean id="myJmsTemplate" 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" />
- <property name="explicitQosEnabled" value="true" />
- </bean>
- </beans>
接收者的配置:
- <?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">
- <!-- 配置JMS連接工廠 -->
- <bean id="myConnectionFactory"
- class="org.springframework.jms.connection.CachingConnectionFactory">
- <!-- Session緩存數量 -->
- <property name="sessionCacheSize" value="10" />
- <!-- 接收者ID -->
- <property name="clientId" value="client_118" />
- <property name="targetConnectionFactory">
- <bean class="org.apache.activemq.ActiveMQConnectionFactory">
- <!-- MQ地址 -->
- <property name="brokerURL"
- value="failover:(tcp://127.0.0.1:61616,tcp://127.0.0.1:61617)?randomize=false" />
- </bean>
- </property>
- </bean>
- <!-- 發送消息的目的地(一個主題) -->
- <bean id="myDestination" class="org.apache.activemq.command.ActiveMQTopic">
- <!-- 設置消息主題的名字 -->
- <constructor-arg index="0" value="Online.Notice.Topic" />
- </bean>
- <!-- 生產消息配置 (自己定義) -->
- <bean id="myTopicConsumer" class="com.xikang.jms.SimpleJMSReceiver" />
- <!-- 消息監聽器 -->
- <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="10000" />
- <!-- 接收者ID -->
- <property name="clientId" value="client_118" />
- <property name="durableSubscriptionName" value="client_118" />
- <property name="destination" ref="myDestination" />
- <property name="messageListener" ref="myTopicListener" />
- </bean>
- </beans>
當有多個接收者時,修改clientId的值。
ActiveMQ好像不支持接收者的集羣。
發送者代碼:
- package com.xikang.jms;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- 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.JmsException;
- import org.springframework.jms.core.JmsTemplate;
- import org.springframework.jms.core.MessageCreator;
- public class SimpleJMSSender {
- private static final Log logger = LogFactory.getLog(SimpleJMSSender.class);
- static int index = 0;
- public static void main(String[] args) {
- ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext-send.xml");
- JmsTemplate jmsTemplate = (JmsTemplate) ctx.getBean("myJmsTemplate");
- for (int i = 0; i < 100; i++) {
- index = i;
- try {
- jmsTemplate.send(new MessageCreator() {
- public Message createMessage(Session session) throws JMSException {
- TextMessage msg = session.createTextMessage();
- // 設置消息屬性
- msg.setStringProperty("phrCode", "C001 " + index);
- // 設置消息內容
- msg.setText("Hello World! " + index);
- logger.info("Send " + index);
- return msg;
- }
- });
- } catch (JmsException e) {
- System.exit(1);
- }
- }
- }
- }
接收者代碼:
- package com.xikang.jms;
- import javax.jms.JMSException;
- import javax.jms.TextMessage;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- import org.springframework.jms.JmsException;
- public class SimpleJMSReceiver {
- private static final Log logger = LogFactory.getLog(SimpleJMSReceiver.class);
- public static void main(String[] args) throws InterruptedException {
- ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext-receive.xml");
- while(true) {
- Thread.sleep(100);
- }
- }
- public void receive(TextMessage message) throws JmsException, JMSException {
- logger.info(message.getText());
- }
- }