環境:本地需安裝activemq,且訪問正常,安裝方法網上很多,這里省略。
1.添加相關jar包,我這里使用的是maven,你也可以選擇其他方式添加。下面是maven相關配置:
<!-- ActiveMQ JMS 相關jar begin --> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-broker</artifactId> <version>5.8.0</version> </dependency> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-client</artifactId> <version>5.14.0</version> </dependency> <dependency> <groupId>org.apache.geronimo.specs</groupId> <artifactId>geronimo-j2ee-management_1.1_spec</artifactId> <version>1.0.1</version> </dependency> <dependency> <groupId>org.apache.geronimo.specs</groupId> <artifactId>geronimo-jms_1.1_spec</artifactId> <version>1.1.1</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.6.6</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jms</artifactId> <version>4.1.5.RELEASE</version> </dependency> <!-- ActiveMQ JMS 相關jar end -->
2.編寫發送和接收處理類
public class MyMessageConverter implements MessageConverter { public Message toMessage(Object object, Session session) throws JMSException, MessageConversionException { return session.createObjectMessage((Serializable) object); } public Object fromMessage(Message message) throws JMSException, MessageConversionException { ObjectMessage objMessage = (ObjectMessage) message; return objMessage.getObject(); }
3.編寫發送實現類,接口類這里就不貼了。
public class ProducerServiceImpl implements ProducerService { private JmsTemplate jmsTemplate; protected final Logger logger = Logger.getLogger(getClass()); public void sendMessage(final Serializable obj) { logger.debug("---------------生產者向MQ發送消息-----------------"); jmsTemplate.convertAndSend(obj); } public JmsTemplate getJmsTemplate() { return jmsTemplate; } @Resource public void setJmsTemplate(JmsTemplate jmsTemplate) { this.jmsTemplate = jmsTemplate; }
4.編寫監聽類
public class MyMessageListener implements MessageListener { @Autowired private MyMessageConverter messageConverter; protected final Logger logger = Logger.getLogger(getClass()); public void onMessage(Message message) { if (message instanceof ObjectMessage) { ObjectMessage objMessage = (ObjectMessage) message; try { Mail mail = (Mail) messageConverter.fromMessage(objMessage); logger.debug("接收到一個ObjectMessage,包含Email對象,准備發送郵件!"); new MailUtil().send(mail); } catch (JMSException e) { logger.info("接收到一個ObjectMessage,但處理失敗!"); } } }
5.配置XML
<context:component-scan base-package="com.guesslive" /> <!-- Spring提供的JMS工具類,它可以進行消息發送、接收等 --> <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> <!-- 這個connectionFactory對應的是我們定義的Spring提供的那個ConnectionFactory對象 --> <property name="connectionFactory" ref="connectionFactory"/> <!-- 消息轉換器 --> <property name="messageConverter" ref="emailMessageConverter"/> <property name="defaultDestination" ref="queueDestination" /> <property name="explicitQosEnabled" value="true" /> <!-- deliveryMode, priority, timeToLive 的開關,要生效,必須配置為true,默認false--> <property name="deliveryMode" value="2" /> <!-- 發送模式 DeliveryMode.NON_PERSISTENT=1:非持久 ; DeliveryMode.PERSISTENT=2:持久 默認2-持久--> </bean> <!-- 類型轉換器 --> <bean id="emailMessageConverter" class="com.guesslive.admin.common.mq.MyMessageConverter"/> <!-- 真正可以產生Connection的ConnectionFactory,由對應的 JMS服務廠商提供--> <bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"> <property name="brokerURL" value="tcp://127.0.0.1:61616"/> <property name="userName" value="admin"/> <property name="password" value="admin"/> <property name="useAsyncSend" value="true" /> <!-- 如果傳輸的對象是Obeject 這里必須加上這句 否則會導致對象序列化失敗 出現classnotfound異常 詳細: http://activemq.apache.org/objectmessage.html --> <property name="trustAllPackages" value="true"/> </bean> <!-- Spring用於管理真正的ConnectionFactory的ConnectionFactory --> <bean id="connectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory"> <!-- 目標ConnectionFactory對應真實的可以產生JMS Connection的ConnectionFactory --> <property name="targetConnectionFactory" ref="targetConnectionFactory"/> </bean> <!--隊列目的地--> <bean id="queueDestination" class="org.apache.activemq.command.ActiveMQQueue"> <constructor-arg> <value>email</value> </constructor-arg> </bean> <!-- 消息監聽器 --> <bean id="consumerMessageListener" class="com.guesslive.admin.common.mq.MyMessageListener"/> <!-- 消息監聽容器 --> <bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> <property name="connectionFactory" ref="connectionFactory" /> <property name="destination" ref="queueDestination" /> <property name="messageListener" ref="consumerMessageListener" /> </bean>
6.發送和接收
//調用向MQ推送消息的方法 producerService.sendMessage(mail);