在Spring中使用JMS

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

 

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

 

1、连接工厂

<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、目的地

<bean id="smsDestination" class="org.apache.activemq.command.ActiveMQQueue"> 
	<constructor-arg value="sms_queue"/> 
</bean>

 

3、JmsTemplate

<bean id="smsJmsTemplate" class="org.springframework.jms.core.JmsTemplate"> 
	<property name="connectionFactory" ref="smsConnectionFactory"/> 
	<property name="defaultDestination" ref="smsDestination"/> 
</bean>

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

 

   用JmsTemplate发送消息:

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、消息监听器

<bean id="smsMessageListener" class="com.travelsky.bravo.components.communication.sms.SmsMessageListener" />

 

   消息监听器类源码:

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

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、任务执行器

<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"/>

 

6、消息监听器容器

<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,否则监听不起作用。

 

你可能感兴趣的:(spring,bean,jms,activemq,mobile)