java ActiveMQ 配置

項目屬性文件

#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  轉載爲方便查看

發佈了49 篇原創文章 · 獲贊 15 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章