在Spring中施用JMS

在Spring中使用JMS
在Spring中使用JMS 博客分类: ActiveMQ_5.3.2 JMSSpringBeanActiveMQMobile Spring对JMS进行封装,使用起来更简单。以下给出范例代码供参考! 在Spring中可以用JmsTemplate对象来发送、接收消息。 1、连接工厂 Xml代码 <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"></property></bean></property></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"></property></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代码 <bean id="smsDestination" class="org.apache.activemq.command.ActiveMQQueue"><constructor-arg value="sms_queue"></constructor-arg></bean><bean id="smsDestination" class="org.apache.activemq.command.ActiveMQQueue"><constructor-arg value="sms_queue"></constructor-arg></bean> 3、JmsTemplate Xml代码 <bean id="smsJmsTemplate" class="org.springframework.jms.core.JmsTemplate"><property name="connectionFactory" ref="smsConnectionFactory"></property><property name="defaultDestination" ref="smsDestination"></property></bean><bean id="smsJmsTemplate" class="org.springframework.jms.core.JmsTemplate"><property name="connectionFactory" ref="smsConnectionFactory"></property><property name="defaultDestination" ref="smsDestination"></property></bean> 用JmsTemplate时不用自己提交session.commit()。 用JmsTemplate发送消息: Java代码 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; } }); 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代码 <bean id="smsMessageListener" class="com.travelsky.bravo.components.communication.sms.SmsMessageListener"></bean><bean id="smsMessageListener" class="com.travelsky.bravo.components.communication.sms.SmsMessageListener"></bean> 消息监听器类源码: 消息监听器类必须实现MessageListener接口类 Java代码 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); } } } 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代码 <bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"></bean><bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"></bean> 6、消息监听器容器 Xml代码 <bean id="smsListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer" lazy-init="false"><property name="connectionFactory" ref="smsConnectionFactory"></property><property name="destination" ref="smsDestination"></property><property name="messageListener" ref="smsMessageListener"></property><property name="taskExecutor" ref="taskExecutor"></property><property name="sessionTransacted" value="true"></property><!-- 应该只是在Destination为Queue的时候才使用多个MessageConsumer --><property name="concurrentConsumers" value="1"></property><property name="maxConcurrentConsumers" value="50"></property><property name="idleTaskExecutionLimit" value="2"></property><property name="receiveTimeout" value="10000"></property><!-- 0:CACHE_NONE,1:CACHE_CONNECTION,2:CACHE_SESSION,3:CACHE_CONSUMER,4:CACHE_AUTO --><property name="cacheLevel" value="0"></property></bean><bean id="smsListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer" lazy-init="false"><property name="connectionFactory" ref="smsConnectionFactory"></property><property name="destination" ref="smsDestination"></property><property name="messageListener" ref="smsMessageListener"></property><property name="taskExecutor" ref="taskExecutor"></property><property name="sessionTransacted" value="true"></property><!-- 应该只是在Destination为Queue的时候才使用多个MessageConsumer --><property name="concurrentConsumers" value="1"></property><property name="maxConcurrentConsumers" value="50"></property><property name="idleTaskExecutionLimit" value="2"></property><property name="receiveTimeout" value="10000"></property><!-- 0:CACHE_NONE,1:CACHE_CONNECTION,2:CACHE_SESSION,3:CACHE_CONSUMER,4:CACHE_AUTO --><property name="cacheLevel" value="0"></property></bean> lazy-init参数值必须设置为false,否则监听不起作用。