自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

三分鐘實(shí)現(xiàn) Spring Boot 集成 RabbitMQ,實(shí)現(xiàn)消息隊(duì)列服務(wù)

開發(fā) 前端
Spring Boot提供了spring-bootstarter-amqp組件對(duì)消息隊(duì)列進(jìn)行支持,使用非常簡(jiǎn)單,僅需要非常少的配置即可實(shí)現(xiàn)完整的消息隊(duì)列服務(wù)。

 [[424312]]

消息中間件在互聯(lián)網(wǎng)公司使用的越來越多,主要用于在分布式系統(tǒng)中存儲(chǔ)轉(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對(duì)RabbitMQ的支持。如何在SpringBoot項(xiàng)目中使用RabbitMQ?

Spring Boot提供了spring-bootstarter-amqp組件對(duì)消息隊(duì)列進(jìn)行支持,使用非常簡(jiǎn)單,僅需要非常少的配置即可實(shí)現(xiàn)完整的消息隊(duì)列服務(wù)。

一、Spring Boot集成RabbitMQ

Spring Boot提供了spring-boot-starter-amqp組件,只需要簡(jiǎn)單的配置即可與Spring Boot無縫集成。下面通過示例演示集成RabbitMQ實(shí)現(xiàn)消息的接收和發(fā)送。

第一步,配置pom包。

創(chuàng)建Spring Boot項(xiàng)目并在pom.xml文件中添加spring-bootstarter-amqp等相關(guān)組件依賴:

  1. <dependency> 
  2.  
  3. <groupId>org.springframework.boot</groupId> 
  4.  
  5. <artifactId>spring-boot-starter-amqp</artifactId> 
  6.  
  7. </dependency> 

在上面的示例中,引入Spring Boot自帶的amqp組件spring-bootstarter-amqp。

第二步,修改配置文件。

修改application.properties配置文件,配置rabbitmq的host地址、端口以及賬戶信息。

  1. spring.rabbitmq.host=10.2.1.231 
  2.  
  3. spring.rabbitmq.port=5672 
  4.  
  5. spring.rabbitmq.username=zhangweizhong 
  6.  
  7. spring.rabbitmq.password=weizhong1988 
  8.  
  9. spring.rabbitmq.virtualHost=order 

在上面的示例中,主要配置RabbitMQ服務(wù)的地址。RabbitMQ配置由spring.rabbitmq.*配置屬性控制。virtual-host配置項(xiàng)指定RabbitMQ服務(wù)創(chuàng)建的虛擬主機(jī),不過這個(gè)配置項(xiàng)不是必需的。

第三步,創(chuàng)建消費(fèi)者。

消費(fèi)者可以消費(fèi)生產(chǎn)者發(fā)送的消息。接下來創(chuàng)建消費(fèi)者類Consumer,并使用@RabbitListener注解來指定消息的處理方法。示例代碼如下:

  1. @Component 
  2. public class Consumer { 
  3.  
  4.     @RabbitHandler 
  5.     @RabbitListener(queuesToDeclare = @Queue("rabbitmq_queue")) 
  6.     public void process(String message) { 
  7.         System.out.println("消費(fèi)者消費(fèi)消息111=====" + message); 
  8.     } 
  9.  

在上面的示例中,Consumer消費(fèi)者通過@RabbitListener注解創(chuàng)建偵聽器端點(diǎn),綁定rabbitmq_queue隊(duì)列。

(1)@RabbitListener注解提供了@QueueBinding、@Queue、@Exchange等對(duì)象,通過這個(gè)組合注解配置交換機(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)鍵類。示例代碼如下:

  1. @Component 
  2. public class Producer { 
  3.  
  4.     @Autowired 
  5.     private RabbitTemplate rabbitTemplate; 
  6.      
  7.     public void produce() { 
  8.         String message = new Date() + "Beijing"
  9.         System.out.println("生產(chǎn)者產(chǎn)生消息=====" + message); 
  10.         rabbitTemplate.convertAndSend("rabbitmq_queue", message); 
  11.     } 

如上面的示例所示,RabbitTemplate提供了 convertAndSend方法發(fā)送消息。convertAndSend方法有routingKey和message兩個(gè)參數(shù):

(1)routingKey為要發(fā)送的路由地址。

(2)message為具體的消息內(nèi)容。發(fā)送者和接收者的queuename必須一致,不然無法接收。

最后,測(cè)試驗(yàn)證。

創(chuàng)建對(duì)應(yīng)的測(cè)試類ApplicationTests,驗(yàn)證消息發(fā)送和接收是否成功。

  1. @RunWith(SpringRunner.class
  2. @SpringBootTest 
  3. public class ApplicationTests { 
  4.  
  5.     @Autowired 
  6.     Producer producer; 
  7.  
  8.     @Test 
  9.     public void contextLoads() throws InterruptedException { 
  10.         producer.produce();  
  11.         Thread.sleep(1*1000); 
  12.  
  13.     } 

在上面的示例中,首先注入生產(chǎn)者對(duì)象,然后調(diào)用produce()方法來發(fā)送消息。

最后,單擊Run Test或在方法上右擊,選擇Run 'contextLoads()',運(yùn)行單元測(cè)試程序,查看后臺(tái)輸出情況,結(jié)果如下圖所示。

通過上面的程序輸出日志可以看到,消費(fèi)者已經(jīng)收到了生產(chǎn)者發(fā)送的消息并進(jìn)行了處理。這是常用的簡(jiǎn)單使用示例。

二、發(fā)送和接收實(shí)體對(duì)象

Spring Boot支持對(duì)象的發(fā)送和接收,且不需要額外的配置。下面通過一個(gè)例子來演示RabbitMQ發(fā)送和接收實(shí)體對(duì)象。

1. 定義實(shí)體類

首先,定義發(fā)送與接收的對(duì)象實(shí)體User類,代碼如下:

  1. public class User implements Serializable { 
  2.  
  3.     public String name; 
  4.  
  5.     public String password; 
  6.  
  7.     // 省略get和set方法 
  8.  

在上面的示例中,定義了普通的User實(shí)體對(duì)象。需要注意的是,實(shí)體類對(duì)象必須繼承Serializable序列化接口,否則會(huì)報(bào)數(shù)據(jù)無法序列化的錯(cuò)誤。

2. 定義消費(fèi)者

修改Consumer類,將參數(shù)換成User對(duì)象。示例代碼如下:

  1. @Component 
  2. public class Consumer { 
  3.  
  4.     @RabbitHandler 
  5.     @RabbitListener(queuesToDeclare = @Queue("rabbitmq_queue_object")) 
  6.     public void process(User user) { 
  7.         System.out.println("消費(fèi)者消費(fèi)消息111user=====name:" + user.getName()+",password:"+user.getPassword()); 
  8.      
  9.     } 

其實(shí),消費(fèi)者類和消息處理方法和之前的類似,只不過將參數(shù)換成了實(shí)體對(duì)象,監(jiān)聽rabbitmq_queue_object隊(duì)列。

3. 定義生產(chǎn)者

修改Producer類,定義User實(shí)體對(duì)象,并通過convertAndSend方法發(fā)送對(duì)象消息。示例代碼如下:

  1. @Component 
  2. public class Producer { 
  3.  
  4.     @Autowired 
  5.     private RabbitTemplate rabbitTemplate; 
  6.      
  7.     public void produce() {  
  8.         User user=new User(); 
  9.         user.setName("weiz"); 
  10.         user.setPassword("123456"); 
  11.         System.out.println("生產(chǎn)者生產(chǎn)消息111=====" + user); 
  12.          
  13.         rabbitTemplate.convertAndSend("rabbitmq_queue_object", user); 
  14.     } 
  15.  

在上面的示例中,還是調(diào)用convertAndSend()方法發(fā)送實(shí)體對(duì)象。convertAndSend()方法支持String、Integer、Object等基礎(chǔ)的數(shù)據(jù)類型。

4. 驗(yàn)證測(cè)試

創(chuàng)建單元測(cè)試類,注入生產(chǎn)者對(duì)象,然后調(diào)用produceObj()方法發(fā)送實(shí)體對(duì)象消息,從而驗(yàn)證消息能否被成功接收。

  1. @RunWith(SpringRunner.class
  2. @SpringBootTest 
  3. public class ApplicationTests { 
  4.  
  5.     @Autowired 
  6.     Producer producer; 
  7.  
  8.     @Test 
  9.     public void testProduceObj() throws InterruptedException { 
  10.         producer.produceObj(); 
  11.         Thread.sleep(1*1000); 
  12.     } 

最后,單擊Run Test或在方法上右擊,選擇Run 'contextLoads()',運(yùn)行單元測(cè)試程序,查看后臺(tái)輸出情況,運(yùn)行結(jié)果如圖12-8所示。

通過上面的示例成功實(shí)現(xiàn)了RabbitMQ發(fā)送和接收實(shí)體對(duì)象,使得消息的數(shù)據(jù)結(jié)構(gòu)更加清晰,也更加貼合面向?qū)ο蟮木幊趟枷搿?/p>

 

責(zé)任編輯:張燕妮 來源: 架構(gòu)師精進(jìn)
相關(guān)推薦

2024-04-01 09:59:08

消息隊(duì)列通信微服務(wù)

2024-09-13 08:49:45

2024-03-28 08:07:42

RabbitMQ訂閱模式

2022-02-16 19:42:25

Spring配置開發(fā)

2024-06-06 08:50:43

2023-12-23 18:04:40

服務(wù)Eureka工具

2023-08-14 09:16:26

消息存儲(chǔ)磁盤

2023-08-24 09:01:25

消息拉取RocketMQ

2023-08-01 09:01:51

Broker? 事務(wù)消息selector

2024-05-16 11:13:16

Helm工具release

2022-02-21 18:16:38

Go語言枚舉

2009-11-09 12:55:43

WCF事務(wù)

2024-12-18 10:24:59

代理技術(shù)JDK動(dòng)態(tài)代理

2024-09-02 00:03:00

tabs組件CSS

2025-03-26 01:35:00

tabs開發(fā)組件

2022-02-17 09:24:11

TypeScript編程語言javaScrip

2021-04-20 13:59:37

云計(jì)算

2023-12-27 08:15:47

Java虛擬線程

2024-01-16 07:46:14

FutureTask接口用法

2024-08-30 08:50:00

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)