3分鐘實(shí)現(xiàn)SpringBoot集成RabbitMQ,實(shí)現(xiàn)消息隊(duì)列服務(wù)
消息中間件在互聯(lián)網(wǎng)公司使用的越來越多,主要用于在分布式系統(tǒng)中存儲轉(zhuǎn)發(fā)消息,在易用性、擴(kuò)展性、高可用性等方面表現(xiàn)不俗。消息隊(duì)列實(shí)現(xiàn)系統(tǒng)之間的雙向解耦,生產(chǎn)者往消息隊(duì)列中發(fā)送消息,消費(fèi)者從隊(duì)列中拿取消息并處理,生產(chǎn)者不用關(guān)心是誰來消費(fèi),消費(fèi)者不用關(guān)心誰在生產(chǎn)消息,從而達(dá)到系統(tǒng)解耦的目的,也大大提高了系統(tǒng)的高可用性和高并發(fā)能力。
接下來介紹Spring Boot對RabbitMQ的支持。如何在SpringBoot項(xiàng)目中使用RabbitMQ?
Spring Boot提供了spring-bootstarter-amqp組件對消息隊(duì)列進(jìn)行支持,使用非常簡單,僅需要非常少的配置即可實(shí)現(xiàn)完整的消息隊(duì)列服務(wù)。
一、Spring Boot集成RabbitMQ
Spring Boot提供了spring-boot-starter-amqp組件,只需要簡單的配置即可與Spring Boot無縫集成。下面通過示例演示集成RabbitMQ實(shí)現(xiàn)消息的接收和發(fā)送。
第一步,配置pom包。
創(chuàng)建Spring Boot項(xiàng)目并在pom.xml文件中添加spring-bootstarter-amqp等相關(guān)組件依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>在上面的示例中,引入Spring Boot自帶的amqp組件spring-bootstarter-amqp。
第二步,修改配置文件。
修改application.properties配置文件,配置rabbitmq的host地址、端口以及賬戶信息。
spring.rabbitmq.host=10.2.1.231
spring.rabbitmq.port=5672
spring.rabbitmq.username=zhangweizhong
spring.rabbitmq.password=weizhong1988
spring.rabbitmq.virtualHost=order在上面的示例中,主要配置RabbitMQ服務(wù)的地址。RabbitMQ配置由spring.rabbitmq.*配置屬性控制。virtual-host配置項(xiàng)指定RabbitMQ服務(wù)創(chuàng)建的虛擬主機(jī),不過這個配置項(xiàng)不是必需的。
第三步,創(chuàng)建消費(fèi)者。
消費(fèi)者可以消費(fèi)生產(chǎn)者發(fā)送的消息。接下來創(chuàng)建消費(fèi)者類Consumer,并使用@RabbitListener注解來指定消息的處理方法。示例代碼如下:
@Component
public class Consumer {
@RabbitHandler
@RabbitListener(queuesToDeclare = @Queue("rabbitmq_queue"))
public void process(String message) {
System.out.println("消費(fèi)者消費(fèi)消息111=====" + message);
}
}在上面的示例中,Consumer消費(fèi)者通過@RabbitListener注解創(chuàng)建偵聽器端點(diǎn),綁定rabbitmq_queue隊(duì)列。
(1)@RabbitListener注解提供了@QueueBinding、@Queue、@Exchange等對象,通過這個組合注解配置交換機(jī)、綁定路由并且配置監(jiān)聽功能等。
(2)@RabbitHandler注解為具體接收的方法。
第四步,創(chuàng)建生產(chǎn)者。
生產(chǎn)者用來產(chǎn)生消息并進(jìn)行發(fā)送,需要用到RabbitTemplate類。與之前的RedisTemplate類似,RabbitTemplate是實(shí)現(xiàn)發(fā)送消息的關(guān)鍵類。示例代碼如下:
@Component
public class Producer {
@Autowired
private RabbitTemplate rabbitTemplate;
public void produce() {
String message = new Date() + "Beijing";
System.out.println("生產(chǎn)者產(chǎn)生消息=====" + message);
rabbitTemplate.convertAndSend("rabbitmq_queue", message);
}
}如上面的示例所示,RabbitTemplate提供了 convertAndSend方法發(fā)送消息。convertAndSend方法有routingKey和message兩個參數(shù):
(1)routingKey為要發(fā)送的路由地址。
(2)message為具體的消息內(nèi)容。發(fā)送者和接收者的queuename必須一致,不然無法接收。
最后,測試驗(yàn)證。
創(chuàng)建對應(yīng)的測試類ApplicationTests,驗(yàn)證消息發(fā)送和接收是否成功。
@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {
@Autowired
Producer producer;
@Test
public void contextLoads() throws InterruptedException {
producer.produce();
Thread.sleep(1*1000);
}
}在上面的示例中,首先注入生產(chǎn)者對象,然后調(diào)用produce()方法來發(fā)送消息。
最后,單擊Run Test或在方法上右擊,選擇Run 'contextLoads()',運(yùn)行單元測試程序,查看后臺輸出情況,結(jié)果如下圖所示。

通過上面的程序輸出日志可以看到,消費(fèi)者已經(jīng)收到了生產(chǎn)者發(fā)送的消息并進(jìn)行了處理。這是常用的簡單使用示例。
二、發(fā)送和接收實(shí)體對象
Spring Boot支持對象的發(fā)送和接收,且不需要額外的配置。下面通過一個例子來演示RabbitMQ發(fā)送和接收實(shí)體對象。
1. 定義實(shí)體類
首先,定義發(fā)送與接收的對象實(shí)體User類,代碼如下:
public class User implements Serializable {
public String name;
public String password;
// 省略get和set方法
}在上面的示例中,定義了普通的User實(shí)體對象。需要注意的是,實(shí)體類對象必須繼承Serializable序列化接口,否則會報(bào)數(shù)據(jù)無法序列化的錯誤。
2. 定義消費(fèi)者
修改Consumer類,將參數(shù)換成User對象。示例代碼如下:
@Component
public class Consumer {
@RabbitHandler
@RabbitListener(queuesToDeclare = @Queue("rabbitmq_queue_object"))
public void process(User user) {
System.out.println("消費(fèi)者消費(fèi)消息111user=====name:" + user.getName()+",password:"+user.getPassword());
}
}其實(shí),消費(fèi)者類和消息處理方法和之前的類似,只不過將參數(shù)換成了實(shí)體對象,監(jiān)聽rabbitmq_queue_object隊(duì)列。
3. 定義生產(chǎn)者
修改Producer類,定義User實(shí)體對象,并通過convertAndSend方法發(fā)送對象消息。示例代碼如下:
@Component
public class Producer {
@Autowired
private RabbitTemplate rabbitTemplate;
public void produce() {
User user=new User();
user.setName("weiz");
user.setPassword("123456");
System.out.println("生產(chǎn)者生產(chǎn)消息111=====" + user);
rabbitTemplate.convertAndSend("rabbitmq_queue_object", user);
}
}在上面的示例中,還是調(diào)用convertAndSend()方法發(fā)送實(shí)體對象。convertAndSend()方法支持String、Integer、Object等基礎(chǔ)的數(shù)據(jù)類型。
4. 驗(yàn)證測試
創(chuàng)建單元測試類,注入生產(chǎn)者對象,然后調(diào)用produceObj()方法發(fā)送實(shí)體對象消息,從而驗(yàn)證消息能否被成功接收。
@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {
@Autowired
Producer producer;
@Test
public void testProduceObj() throws InterruptedException {
producer.produceObj();
Thread.sleep(1*1000);
}
}最后,單擊Run Test或在方法上右擊,選擇Run 'contextLoads()',運(yùn)行單元測試程序,查看后臺輸出情況,運(yùn)行結(jié)果如圖12-8所示。

通過上面的示例成功實(shí)現(xiàn)了RabbitMQ發(fā)送和接收實(shí)體對象,使得消息的數(shù)據(jù)結(jié)構(gòu)更加清晰,也更加貼合面向?qū)ο蟮木幊趟枷搿?/span>
推薦閱讀:
SpringBoot入門系列(三十一) 實(shí)現(xiàn)靜態(tài)文件、配置文件與jar分離
SpringBoot入門系列(三十)Spring Boot項(xiàng)目打包、發(fā)布與部署
SpringBoot入門系列(二十九)如何使用JdbcTemplate操作數(shù)據(jù)庫?
SpringBoot入門系列(二十八)使用Redis實(shí)現(xiàn)分布式Session共享
Spring Boot入門系列(二十一) 如何優(yōu)雅的設(shè)計(jì)Rest API版本號,實(shí)現(xiàn)API版本控制
Spring Boot入門系列(十九)集成mybatis,使用注解實(shí)現(xiàn)動態(tài)Sql、參數(shù)傳遞等常用操作!
Spring Boot入門系列(十八)mybatis 使用注解實(shí)現(xiàn)增刪改查,無需xml文件
Spring Boot入門系列(十七)Mybatis創(chuàng)建自定義mapper 實(shí)現(xiàn)多表關(guān)聯(lián)查詢!
Spring Boot入門系列(十六)整合pagehelper,一秒實(shí)現(xiàn)分頁功能!
Spring Boot入門系列(十五) SpringBoot開發(fā)環(huán)境熱部署的配置
Spring Boot入門系列(十三)統(tǒng)一日志處理!
Spring Boot入門系列(十一)如何整合Mybatis,實(shí)現(xiàn)增刪改查【XML 配置版】
Spring Boot入門系列(十)如何使用攔截器,一學(xué)就會!
SpringBoot入門系列(三)SpringBoot資源文件屬性配置
SpringBoot入門系列(二)Controller介紹及如何返回json數(shù)據(jù)
SpringBoot入門系列(一)如何快速創(chuàng)建SpringBoot項(xiàng)

