Spring JMS应用

来源:互联网 发布:淘宝自然搜索排名 编辑:程序博客网 时间:2024/06/05 04:07
JMS用于系统间的异步通信,在将系统功能进行纵向拆分时,是很好的解决方案,通过消息驱动来实现业务分离。

消息中间件有很多,开源的有Apache的ActiveMQ,商业的有IBM MQ等,以下是基于ActiveMQ的spring配置

[html] view plaincopy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:amq="http://activemq.apache.org/schema/core"  
  4.     xmlns:jms="http://www.springframework.org/schema/jms"  
  5.     xmlns:aop="http://www.springframework.org/schema/aop"  
  6.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  7.     xsi:schemaLocation="  
  8.            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
  9.            http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core-5.2.0.xsd  
  10.            http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-2.5.xsd  
  11.            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">  
  12.     <!-- 将ActiveMQ内嵌到应用程序中   
  13.     <amq:broker useJmx="false" persistent="true">  
  14.         <amq:transportConnectors>  
  15.             <amq:transportConnector uri="tcp://localhost:61616"/>  
  16.         </amq:transportConnectors>  
  17.     </amq:broker>  
  18.     -->  
  19.     <!-- 定义消息队列 -->     
  20.     <amq:queue id="indexChannel" physicalName="SOLR.INDEX"/>  
  21.     <!-- 定义连接工厂 -->  
  22.     <amq:connectionFactory id="connectionFactory" brokerURL="tcp://localhost:61616"/>  
  23.     <!--   
  24.     <bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">    
  25.         <property name="connectionFactory" ref="connectionFactory"/>    
  26.         <property name="maxConnections" value="100"/>    
  27.     </bean>  
  28.      -->    
  29.     <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">  
  30.         <property name="connectionFactory" ref="connectionFactory"/>  
  31.     </bean>  
  32.     <!-- 消息发送者 -->  
  33.     <bean id="messageSender" class="org.chen.jms.MessageSender">  
  34.         <property name="jmsTemplate">  
  35.             <ref bean="jmsTemplate"/>  
  36.         </property>  
  37.         <property name="destination">  
  38.             <ref bean="indexChannel"/>  
  39.         </property>  
  40.     </bean>  
  41.     <!-- 定义消息监听器 -->  
  42.     <bean id="indexListener" class="org.chen.jms.IndexListener"/>  
  43.     <jms:listener-container concurrency="10" > <!-- concurrency指定最多可并发开启10个监听器 -->  
  44.         <jms:listener id="listener" destination="SOLR.INDEX" ref="indexListener" />  
  45.     </jms:listener-container>  
  46. </beans>  
消息生产者代码如下:
[java] view plaincopy
  1. public class MessageSender {  
  2.     private JmsTemplate jmsTemplate;  
  3.     private Destination destination;  
  4.       
  5.     public void send(Object message){  
  6.         jmsTemplate.setDeliveryMode(DeliveryMode.PERSISTENT);  
  7.         jmsTemplate.convertAndSend(destination,message);  
  8.     }  
  9.       
  10.     public JmsTemplate getJmsTemplate() {  
  11.         return jmsTemplate;  
  12.     }  
  13.     public void setJmsTemplate(JmsTemplate jmsTemplate) {  
  14.         this.jmsTemplate = jmsTemplate;  
  15.     }  
  16.     public Destination getDestination() {  
  17.         return destination;  
  18.     }  
  19.     public void setDestination(Destination destination) {  
  20.         this.destination = destination;  
  21.     }  
  22. }  
消息监听器代码如下:
[java] view plaincopy
  1. public class IndexListener implements MessageListener {  
  2.   
  3.     @Override  
  4.     public void onMessage(Message msg) {  
  5.         ObjectMessage objMsg=(ObjectMessage) msg;  
  6.         try {  
  7.             Serializable obj=objMsg.getObject();  
  8.             System.out.println(obj);  
  9.             //TODO 处理独立出去的业务逻辑  
  10.         } catch (JMSException e) {  
  11.             e.printStackTrace();  
  12.         }  
  13.     }  
  14.   
  15. }