RabbitMQ入門教程 For Java【9】 - 與Spring集成
簡介:
? ? ? ? RabbitMQ在與Spring集成我做了兩個項目,一個項目是消息生產者,負責發送消息,另外一個是消息消費者,負責監聽消息。大致的流程圖如下:

項目環境:
Windows7 64bit
Eclipse Kepler SR2
JDK 1.7
Tomcat 7
RabbitMQ 3.6.0
項目源碼地址:
生產者:https://github.com/chwshuang/spring-rabbitmq-producer
消費者:https://github.com/chwshuang/spring-rabbitmq-customer
# 生產者:
? ? ? ? 與Spring集成的項目使用的是Maven,只需要一個依賴配置就搞定:
~~~
lt;dependency>??
org.springframework.amqp??
spring-rabbit??
1.3.5.RELEASE??
lt;/dependency>??
~~~
? ? ? ??消息生產者在Spring的配置也比較簡單,只需要一個連接工廠和一個連接模版類就搞定了。
? ? ? ??生產者在Spring中使用時,只需要定義一個服務接口實現類即可。
~~~
@Service("rabbitService")
public class RabbitServiceImpl {
private static Logger log = LoggerFactory.getLogger(RabbitServiceImpl.class);
@Autowired
private RabbitTemplate rabbitTemplate;
/**
* 發送消息
* @param msg 消息內容
* @param routingKey 路由關鍵字
* void
*/
public void setMessage(String msg, String routingKey) {
rabbitTemplate.convertAndSend(routingKey, msg);
log.info("rabbitmq--發送消息完成: routingKey[{}]-msg[{}]", routingKey, msg);
}
}
~~~
生產者端還需要創建一個測試頁面,通過Ajax技術發送消息到生產者端的控制層,由控制層調用消息服務層發送消息。
~~~
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script src="http://cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script>
<title>測試</title>
<script type="text/javascript">
function sendMsg(){
var t = $("#type").val();
//alert(t);
$.post('/producer/rabbit/setMessage',{msg:'hello world '+t+' rabbit!',type:t}, function(result){
if(result.success){
//alert("發送成功");
}else{
alert("發送失敗");
}
},'json');
}
</script>
</head>
<body>
<h1>發送消息</h1><hr>
<select id="type" >
<option selected="selected" value="red">red</option>
<option value="blue">blue</option>
</select>
<button id="send" onclick="sendMsg()" value="發送消息" type="button" title="send">發送</button>
</body>
</html>
~~~
# 消費者:
? ? ? ??RabbitMQ的消息消費者需要監聽消息,以及處理收到的消息,所以需要配置一個監聽器,聲明一個需要監聽的隊列,和一個消息處理器。消費者端與spring集成的侵入較少。
~~~
<pre name="code" class="plain"> <!-- ========================================RabbitMQ========================================= -->
<!-- 連接工廠 -->
<rabbit:connection-factory id="connectionFactory" host="192.168.5.198" publisher-confirms="true" virtual-host="test" username="test" password="1234" />
<!-- 監聽器 -->
<rabbit:listener-container connection-factory="connectionFactory">
<!-- queues是隊列名稱,可填多個,用逗號隔開, method是ref指定的Bean調用Invoke方法執行的方法名稱 -->
<rabbit:listener queues="red" method="onMessage" ref="redQueueListener" />
<rabbit:listener queues="blue" method="onMessage" ref="blueQueueListener" />
</rabbit:listener-container>
<!-- 隊列聲明 -->
<rabbit:queue name="red" durable="true" />
<!-- 隊列聲明 -->
<rabbit:queue name="blue" durable="true" />
<!-- 紅色監聽處理器 -->
<bean id="redQueueListener" class="com.aitongyi.customer.RedQueueListener" />
<!-- 藍色監聽處理器 -->
<bean id="blueQueueListener" class="com.aitongyi.customer.BlueQueueListener" />
~~~
? ? ? ??消息處理器可以只是一個通過spring管理的普通Bean對象,需要有一個在xml中定義method同名的方法
~~~
public class RedQueueListener{
private static Logger log = LoggerFactory.getLogger(RedQueueListener.class);
/**
* 處理消息
* @param message
* void
*/
public void onMessage(String message) {
log.info("RedQueueListener--receved:" + message);
}
}
~~~
# RabbitMQ創建消息環境
? ? ? ? 在項目開發完成后,我們需要在RabbitMQ中創建vhost,user、queues,這樣,消費者在啟動的時候,登錄、聲明虛擬機、隊列就不會報錯。
1\. 創建test虛擬機,然后點擊Name標簽,進入虛擬機,添加權限

2\. 進入【Admin】菜單【Users】標簽創建用戶,然后點擊用戶名稱進入詳情設置權限


3\. 進入【Queues】菜單,創建隊列

# 執行測試:
將生產者和消費者項目添加到Tomcat中,然后啟動,在瀏覽器輸入【http://localhost:8080/producer/test.jsp】,進入測試頁面,分別發送紅色、藍色的消息到隊列,消費者端會顯示接收日志


生產者端日志
~~~
2016-01-25 18:09:26 722 [INFO] c.a.p.c.RabbitController - rabbitmq--收到待發送消息: type[blue]-msg[hello world blue rabbit!]
2016-01-25 18:09:26 723 [INFO] c.a.p.s.RabbitServiceImpl - rabbitmq--發送消息完成: routingKey[blue]-msg[hello world blue rabbit!]
2016-01-25 18:09:28 715 [INFO] c.a.p.c.RabbitController - rabbitmq--收到待發送消息: type[red]-msg[hello world red rabbit!]
2016-01-25 18:09:28 716 [INFO] c.a.p.s.RabbitServiceImpl - rabbitmq--發送消息完成: routingKey[red]-msg[hello world red rabbit!]
~~~
消費者端日志
~~~
2016-01-25 18:09:26 727 [INFO] c.a.c.BlueQueueListener - BlueQueueListener Receved:hello world blue rabbit!
2016-01-25 18:09:28 719 [INFO] c.a.c.RedQueueListener - RedQueueListener Receved:hello world red rabbit!
~~~