天天看點

3分鐘實作SpringBoot內建RabbitMQ,實作消息隊列服務!一、Spring Boot內建RabbitMQ二、發送和接收實體對象最後

消息中間件在網際網路公司使用得越來越多,主要用于在分布式系統中存儲轉發消息,在易用性、擴充性、高可用性等方面表現不俗。

3分鐘實作SpringBoot內建RabbitMQ,實作消息隊列服務!一、Spring Boot內建RabbitMQ二、發送和接收實體對象最後

如上如圖所示,消息隊列實作系統之間的雙向解耦,生産者往消息隊列中發送消息,消費者從隊列中拿取消息并處理,生産者不用關心是誰來消費,消費者不用關心誰在生産消息,進而達到系統解耦的目的,也大大提高了系統的高可用性和高并發能力。

Spring Boot提供了spring-bootstarter-amqp元件對消息隊列進行支援,使用非常簡單,僅需要非常少的配置即可實作完整的消息隊列服務。

接下來介紹Spring Boot對RabbitMQ的支援。如何在SpringBoot項目中使用RabbitMQ?

一、Spring Boot內建RabbitMQ

Spring Boot提供了spring-boot-starter-amqp元件,隻需要簡單的配置即可與Spring Boot無縫內建。下面通過示例示範內建RabbitMQ實作消息的接收和發送。

第一步,配置pom包。

建立Spring Boot項目并在pom.xml檔案中添加spring-bootstarter-amqp等相關元件依賴:

<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服務的位址。RabbitMQ配置由spring.rabbitmq.*配置屬性控制。virtual-host配置項指定RabbitMQ服務建立的虛拟主機,不過這個配置項不是必需的。

第三步,建立消費者

消費者可以消費生産者發送的消息。接下來建立消費者類Consumer,并使用@RabbitListener注解來指定消息的處理方法。示例代碼如下:

@Component
public class Consumer {
    @RabbitHandler
    @RabbitListener(queuesToDeclare = @Queue("rabbitmq_queue"))
    public void process(String message) {
        System.out.println("消費者消費消息111=====" + message);
    }
}      

在上面的示例中,Consumer消費者通過@RabbitListener注解建立偵聽器端點,綁定rabbitmq_queue隊列。

(1)@RabbitListener注解提供了@QueueBinding、@Queue、@Exchange等對象,通過這個組合注解配置交換機、綁定路由并且配置監聽功能等。

(2)@RabbitHandler注解為具體接收的方法。

第四步,建立生産者

生産者用來産生消息并進行發送,需要用到RabbitTemplate類。與之前的RedisTemplate類似,RabbitTemplate是實作發送消息的關鍵類。示例代碼如下:

@Component
public class Producer {
    @Autowired
    private RabbitTemplate rabbitTemplate;
    
    public void produce() {
        String message = new Date() + "Beijing";
        System.out.println("生産者産生消息=====" + message);
        rabbitTemplate.convertAndSend("rabbitmq_queue", message);
    }
}      

如上面的示例所示,RabbitTemplate提供了 convertAndSend方法發送消息。convertAndSend方法有routingKey和message兩個參數:

(1)routingKey為要發送的路由位址。

(2)message為具體的消息内容。發送者和接收者的queuename必須一緻,不然無法接收。

第五步,測試驗證。

建立對應的測試類ApplicationTests,驗證消息發送和接收是否成功。

@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {
    @Autowired
    Producer producer;
    @Test
    public void contextLoads() throws InterruptedException {
        producer.produce(); 
        Thread.sleep(1*1000);
    }
}      

在上面的示例中,首先注入生産者對象,然後調用produce()方法來發送消息。

最後,單擊Run Test或在方法上右擊,選擇Run 'contextLoads()',運作單元測試程式,檢視背景輸出情況,結果如下圖所示。

3分鐘實作SpringBoot內建RabbitMQ,實作消息隊列服務!一、Spring Boot內建RabbitMQ二、發送和接收實體對象最後

通過上面的程式輸出日志可以看到,消費者已經收到了生産者發送的消息并進行了處理。這是常用的簡單使用示例。

二、發送和接收實體對象

Spring Boot支援對象的發送和接收,且不需要額外的配置。下面通過一個例子來示範RabbitMQ發送和接收實體對象。

1. 定義消息實體

首先,定義發送與接收的對象實體User類,代碼如下:

public class User implements Serializable {
    public String name;
    public String password;
    // 省略get和set方法
}      

在上面的示例中,定義了普通的User實體對象。需要注意的是,實體類對象必須繼承Serializable序列化接口,否則會報資料無法序列化的錯誤。

2. 定義消費者

修改Consumer類,将參數換成User對象。示例代碼如下:

@Component
public class Consumer {
    @RabbitHandler
    @RabbitListener(queuesToDeclare = @Queue("rabbitmq_queue_object"))
    public void process(User user) {
        System.out.println("消費者消費消息111user=====name:" + user.getName()+",password:"+user.getPassword());
    
    }
}      

其實,消費者類和消息處理方法和之前的類似,隻不過将參數換成了實體對象,監聽rabbitmq_queue_object隊列。

3. 定義生産者

修改Producer類,定義User實體對象,并通過convertAndSend方法發送對象消息。示例代碼如下:

@Component
public class Producer {
    @Autowired
    private RabbitTemplate rabbitTemplate;
    
    public void produce() { 
        User user=new User();
        user.setName("weiz");
        user.setPassword("123456");
        System.out.println("生産者生産消息111=====" + user);
        
        rabbitTemplate.convertAndSend("rabbitmq_queue_object", user);
    }
}      

在上面的示例中,還是調用convertAndSend()方法發送實體對象。convertAndSend()方法支援String、Integer、Object等基礎的資料類型。

4. 驗證測試

建立單元測試類,注入生産者對象,然後調用produceObj()方法發送實體對象消息,進而驗證消息能否被成功接收。

@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()',運作單元測試程式,檢視背景輸出情況,運作結果如下圖所示。

3分鐘實作SpringBoot內建RabbitMQ,實作消息隊列服務!一、Spring Boot內建RabbitMQ二、發送和接收實體對象最後

通過上面的示例成功實作了RabbitMQ發送和接收實體對象,使得消息的資料結構更加清晰,也更加貼合面向對象的程式設計思想。

最後

以上,我們就把Spring Boot使用RabbitMQ的問題介紹完了。消息中間件在網際網路公司使用得越來越多,希望大家能夠熟悉其使用。

推薦閱讀:

SpringBoot從入門到精通(三十)如何使用JdbcTemplate操作資料庫? SpringBoot從入門到精通(二十九)使用Redis實作分布式Session共享 SpringBoot從入門到精通(二十八)JPA 的實體映射關系,一對一,一對多,多對多關系映射! SpringBoot從入門到精通(二十七)JPA實作自定義查詢,完全不需要寫SQL! SpringBoot從入門到精通(二十六)超級簡單的資料持久化架構!Spring Data JPA 的使用! SpringBoot從入門到精通(二十五)搞懂自定義系統配置 SpringBoot從入門到精通(二十四)3分鐘搞定Spring Boot 多環境配置! SpringBoot從入門到精通(二十三)Mybatis系列之——實作Mybatis多資料源配置 SpringBoot從入門到精通(二十二)使用Swagger2優雅建構 RESTful API文檔