在Spring中使用JMS

Spring对JMS进行封装,使用起来更简单。以下给出范例代码供参考!

 

在Spring中可以用JmsTemplate对象来发送、接收消息。

 

1、连接工厂

Xml代码 复制代码  收藏代码
  1. <bean id="smsConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">    
  2.     <property name="connectionFactory">    
  3.         <bean class="org.apache.activemq.ActiveMQConnectionFactory">    
  4.             <property name="brokerURL" value="tcp://localhost:61616"/>  
  5.         </bean>    
  6.     </property>    
  7. </bean>  
<bean id="smsConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop"> 

	<property name="connectionFactory"> 

		<bean class="org.apache.activemq.ActiveMQConnectionFactory"> 

			<property name="brokerURL" value="tcp://localhost:61616"/>

		</bean> 

	</property> 

</bean>

    在非web/EJB容器中使用pool时,要手动stop,spring不会为你执行destroy-method的方法。

    如果使用了PooledConnectionFactory要把 apache-activemq-5.3.0\lib\optional\activemq-pool-5.3.0.jar 加到 classpath中。

 

2、目的地

Xml代码 复制代码  收藏代码
  1. <bean id="smsDestination" class="org.apache.activemq.command.ActiveMQQueue">    
  2.     <constructor-arg value="sms_queue"/>    
  3. </bean>  
<bean id="smsDestination" class="org.apache.activemq.command.ActiveMQQueue"> 

	<constructor-arg value="sms_queue"/> 

</bean>

 

3、JmsTemplate

Xml代码 复制代码  收藏代码
  1. <bean id="smsJmsTemplate" class="org.springframework.jms.core.JmsTemplate">    
  2.     <property name="connectionFactory" ref="smsConnectionFactory"/>    
  3.     <property name="defaultDestination" ref="smsDestination"/>    
  4. </bean>  
<bean id="smsJmsTemplate" class="org.springframework.jms.core.JmsTemplate"> 

	<property name="connectionFactory" ref="smsConnectionFactory"/> 

	<property name="defaultDestination" ref="smsDestination"/> 

</bean>

    用JmsTemplate时不用自己提交session.commit()。

 

   用JmsTemplate发送消息:

Java代码 复制代码  收藏代码
  1. jmsTemplate.send(new MessageCreator() {   
  2.     @Override  
  3.     public Message createMessage(Session session) throws JMSException {   
  4.         MapMessage map = session.createMapMessage();   
  5.         map.setString("mobile", mobile);   
  6.         map.setString("content", content);   
  7.         return map;   
  8.     }   
  9. });  
jmsTemplate.send(new MessageCreator() {

	@Override

	public Message createMessage(Session session) throws JMSException {

		MapMessage map = session.createMapMessage();

		map.setString("mobile", mobile);

		map.setString("content", content);

		return map;

	}

});

   

4、消息监听器

Java代码 复制代码  收藏代码
  1. <bean id="smsMessageListener" class="com.travelsky.bravo.components.communication.sms.SmsMessageListener" />  
<bean id="smsMessageListener" class="com.travelsky.bravo.components.communication.sms.SmsMessageListener" />

 

   消息监听器类源码:

    消息监听器类必须实现MessageListener接口类

Java代码 复制代码  收藏代码
  1. public class SmsMessageListener implements MessageListener {   
  2.     @Override  
  3.     public void onMessage(Message message) {   
  4.         try{   
  5.             if(message!=null && message instanceof MapMessage){   
  6.                 MapMessage map = (MapMessage) message;   
  7.                 String mobile = map.getString("mobile");   
  8.                 String content = map.getString("content");   
  9.                    
  10.                 send(mobile, content);   
  11.             }   
  12.         }catch(JMSException ex){   
  13.             logger.error(ex);   
  14.         }   
  15.     }   
  16. }  
public class SmsMessageListener implements MessageListener {

	@Override

	public void onMessage(Message message) {

		try{

			if(message!=null && message instanceof MapMessage){

				MapMessage map = (MapMessage) message;

				String mobile = map.getString("mobile");

				String content = map.getString("content");

				

				send(mobile, content);

			}

		}catch(JMSException ex){

			logger.error(ex);

		}

	}

}

 

5、任务执行器

Xml代码 复制代码  收藏代码
  1. <bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"/>  
<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"/>

 

6、消息监听器容器

Xml代码 复制代码  收藏代码
  1. <bean id="smsListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer" lazy-init="false">    
  2.     <property name="connectionFactory" ref="smsConnectionFactory" />    
  3.     <property name="destination" ref="smsDestination" />    
  4.     <property name="messageListener" ref="smsMessageListener" />  
  5.     <property name="taskExecutor" ref="taskExecutor"/>  
  6.        
  7.     <property name="sessionTransacted" value="true"/>    
  8.   
  9.     <!-- 应该只是在Destination为Queue的时候才使用多个MessageConsumer -->  
  10.     <property name="concurrentConsumers" value="1"/>    
  11.     <property name="maxConcurrentConsumers" value="50" />    
  12.        
  13.     <property name="idleTaskExecutionLimit" value="2" />  
  14.     <property name="receiveTimeout" value="10000" />    
  15.        
  16.     <!-- 0:CACHE_NONE,1:CACHE_CONNECTION,2:CACHE_SESSION,3:CACHE_CONSUMER,4:CACHE_AUTO -->     
  17.     <property name="cacheLevel" value="0"/>    
  18. </bean>  
<bean id="smsListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer" lazy-init="false"> 

	<property name="connectionFactory" ref="smsConnectionFactory" /> 

	<property name="destination" ref="smsDestination" /> 

	<property name="messageListener" ref="smsMessageListener" />

	<property name="taskExecutor" ref="taskExecutor"/>

	

	<property name="sessionTransacted" value="true"/>	



	<!-- 应该只是在Destination为Queue的时候才使用多个MessageConsumer -->

	<property name="concurrentConsumers" value="1"/> 

	<property name="maxConcurrentConsumers" value="50" /> 

	

	<property name="idleTaskExecutionLimit" value="2" />

	<property name="receiveTimeout" value="10000" /> 

	

	<!-- 0:CACHE_NONE,1:CACHE_CONNECTION,2:CACHE_SESSION,3:CACHE_CONSUMER,4:CACHE_AUTO -->  

	<property name="cacheLevel" value="0"/> 

</bean>

    lazy-init参数值必须设置为false,否则监听不起作用。

 

<转:http://chenjumin.iteye.com/blog/760017>

你可能感兴趣的:(spring)