最近研究了一下spring/spring boot與activeMq的整合,花費了很多時間,也遇到了很多坑,工作之餘,總結一下。
業務邏輯是這樣的,有一個功能(比如用戶註冊)運行十分緩慢,但是實際需要發起請求之後馬上提示“處理成功”而不關心是否真的處理成功,這種情況就可以交給MQ來處理。
本文章不再介紹springMVC的搭建與activeMq的安裝,有需要的讀者可以自行學習。
下面直接發佈代碼:
1、引入mq相關依賴
<!-- 適用於springMVC -->
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-spring</artifactId>
<version>5.14.5</version>
</dependency>
2、編寫mq資源文件mq-config.properties並引入
spring.activemq.broker-url=tcp://127.0.0.1:61616
spring.activemq.user=admin
spring.activemq.password=admin
# 支持所有的包,詳見http://activemq.apache.org/objectmessage.html
spring.activemq.packages.trust-all=true
3、編寫mq配置文件(spring-mq.xml)並引入
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:amq="http://activemq.apache.org/schema/core"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core-5.14.5.xsd">
<!--設置activeMq的屬性,包括用戶名密碼-->
<amq:connectionFactory id="amqConnectionFactory" brokerURL="${spring.activemq.broker-url}"
userName="${spring.activemq.user}" password="${spring.activemq.password}"/>
<!--連接池,注意最好不要簡單地命名爲connectionFactory,容易與其他連接池重名-->
<bean id="myMqConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
<property name="targetConnectionFactory" ref="amqConnectionFactory"></property>
<!-- 會話的最大連接數 -->
<property name="sessionCacheSize" value="10"></property>
</bean>
<!--配置生產者-->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="myMqConnectionFactory"></property>
</bean>
<!-- 隊列,注意命名,這裏假設模擬註冊,就叫registerQueue-->
<bean id="registerQueue" class="org.apache.activemq.command.ActiveMQQueue">
<!--構造參數中name的值,最終會顯示在mq控制檯的Queues列表中-->
<constructor-arg value="register"></constructor-arg>
</bean>
<!--監聽器-->
<bean id="registerListener" class="com.zcx.listener.RegisterListener"></bean>
<bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="myMqConnectionFactory"></property>
<property name="destination" ref="registerQueue"></property>
<property name="messageListener" ref="registerListener"></property>
</bean>
</beans>
4、發送消息到消息隊列
public void execute_String() {
String s = "hi,mq!";
jmsTemplate.convertAndSend(registerQueue, s);
}
5、接收消息
public class RegisterListener implements MessageListener{
public void onMessage(Message message) {
try {
// 接收String
if (message instanceof TextMessage) {
TextMessage tm = (TextMessage) message;
String result = tm.getText();
System.out.println(result);
}
} catch (JMSException e) {
e.printStackTrace();
}
}
}