java ActiveMQ 配置

来源:互联网 发布:java动态实现统计图 编辑:程序博客网 时间:2024/04/28 23:03

项目属性文件

#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/beanshttp://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  转载为方便查看

原创粉丝点击