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