項目屬性文件
#activemq settings
#vm broker
jms.broker_url=vm://showcase?broker.persistent=false&broker.useJmx=false&broker.schedulerSupport=false
#localhost broker
#jms.broker_url=tcp://localhost:61616
#network of brokers
#jms.broker_url=failover://(tcp://mqremote1:61616,tcp://mqremote2:61616)?randomize=false&initialReconnectDelay=100&timeout=5000
jms.clicent_id=durableTopicListenerDemo
1、配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<description>JMS高級應用配置(NON_PERSISTENT,DURIABLE,SELECTOR)</description>
<!-- ActiveMQ 連接工廠 -->
<bean id="advancedConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="${jms.broker_url}" />
<!-- 對PERSISTENT的消息進行異步發送(NON_PERSISTENT消息默認異步發送) -->
<!-- <property name="useAsyncSend" value="true" /> -->
</bean>
<!-- 持久化主題訂閱者ActiveMQ 連接工廠 -->
<bean id="advancedTopicConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="${jms.broker_url}" />
<!-- Durable訂閱者必須設置ClientId -->
<property name="clientID" value="${jms.clicent_id}" />
</bean>
<!-- Spring Caching 連接工廠 -->
<bean id="advancedCachingConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
<property name="targetConnectionFactory" ref="advancedConnectionFactory" />
<property name="sessionCacheSize" value="10" />
</bean>
<!-- Queue定義 -->
<bean id="advancedNotifyQueue" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg value="q.advanced.notify" />
</bean>
<!-- Topic定義 -->
<bean id="advancedNotifyTopic" class="org.apache.activemq.command.ActiveMQTopic">
<constructor-arg value="t.advanced.notify" />
</bean>
<!-- Spring JMS Template -->
<bean id="advancedJmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="advancedCachingConnectionFactory" />
<!-- 使 deliveryMode, priority, timeToLive設置生效-->
<property name="explicitQosEnabled" value="true" />
<!-- 設置NON_PERSISTENT模式, 默認爲PERSISTENT -->
<property name="deliveryPersistent" value="false" />
<!-- 設置優先級, 默認爲4 -->
<property name="priority" value="9" />
</bean>
<!-- 使用Spring JmsTemplate的消息生產者 -->
<bean id="advancedNotifyMessageProducer" class="org.springside.examples.showcase.jms.advanced.AdvancedNotifyMessageProducer">
<property name="jmsTemplate" ref="advancedJmsTemplate" />
<property name="notifyQueue" ref="advancedNotifyQueue" />
<property name="notifyTopic" ref="advancedNotifyTopic" />
</bean>
<!-- 異步接收Queue消息Container -->
<bean id="advancedQueueContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="advancedConnectionFactory" />
<property name="destination" ref="advancedNotifyQueue" />
<property name="messageListener" ref="advancedNotifyMessageListener" />
<!-- 初始5個Consumer, 可動態擴展到10 -->
<property name="concurrentConsumers" value="5" />
<property name="maxConcurrentConsumers" value="10" />
<!-- 設置消息確認模式爲Client -->
<property name="sessionAcknowledgeModeName" value="CLIENT_ACKNOWLEDGE" />
</bean>
<!-- 異步接收Topic消息Container -->
<bean id="advancedTopicContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="advancedTopicConnectionFactory" />
<property name="destination" ref="advancedNotifyTopic" />
<property name="messageListener" ref="advancedNotifyMessageListener" />
<!-- JMS Selector消息過濾器 -->
<property name="messageSelector" value="objectType='user'" />
<!-- 持久化訂閱者 -->
<property name="subscriptionDurable" value="true" />
</bean>
<!-- 異步接收消息處理類 -->
<bean id="advancedNotifyMessageListener" class="org.springside.examples.showcase.jms.advanced.AdvancedNotifyMessageListener" />
</beans>
2、JMS用戶變更消息生產者,使用jmsTemplate將用戶變更消息分別發送到queue與topic
public class AdvancedNotifyMessageProducer {
private JmsTemplate jmsTemplate;
private Destination notifyQueue;
private Destination notifyTopic;
public void sendQueue(final User user) {
sendMessage(user, notifyQueue);
}
public void sendTopic(final User user) {
sendMessage(user, notifyTopic);
}
使用jmsTemplate的send/MessageCreator()發送Map類型的消息並在Message中附加屬性用於消息過濾.
private void sendMessage(final User user, Destination destination) {
jmsTemplate.send(destination, new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
MapMessage message = session.createMapMessage();
message.setString("userName", user.getName());
message.setString("email", user.getEmail());
message.setStringProperty("objectType", "user");
return message;
}
});
}
public void setJmsTemplate(JmsTemplate jmsTemplate) {
this.jmsTemplate = jmsTemplate;
}
public void setNotifyQueue(Destination notifyQueue) {
this.notifyQueue = notifyQueue;
}
public void setNotifyTopic(Destination nodifyTopic) {
this.notifyTopic = nodifyTopic;
}
}
3、消息的異步被動接收者.
使用Spring的MessageListenerContainer偵聽消息並調用本Listener進行處理.
public class AdvancedNotifyMessageListener implements MessageListener {
private static Logger logger = LoggerFactory.getLogger(AdvancedNotifyMessageListener.class);
MessageListener回調函數.
@Override
public void onMessage(Message message) {
try {
MapMessage mapMessage = (MapMessage) message;
//打印消息詳情
logger.info("UserName:" + mapMessage.getString("userName") + ", Email:" + mapMessage.getString("email")
+ ", ObjectType:" + mapMessage.getStringProperty("objectType"));
} catch (Exception e) {
logger.error("處理消息時發生異常.", e);
}
}
}
此文章來自:http://blog.sina.com.cn/s/blog_9d0ce63d01012shg.html 轉載爲方便查看