8. 消息隊列 - SpringAMQP - RabbitMQ的java客戶端

將來我們開發(fā)業(yè)務(wù)功能的時候,肯定不會在控制臺收發(fā)消息,而是應(yīng)該基于編程的方式。由于RabbitMQ采用了AMQP協(xié)議,因此它具備跨語言的特性。任何語言只要遵循AMQP協(xié)議收發(fā)消息,都可以與RabbitMQ交互。并且RabbitMQ官方也提供了各種不同語言的客戶端。
但是,RabbitMQ官方提供的Java客戶端編碼相對復雜,一般生產(chǎn)環(huán)境下我們更多會結(jié)合Spring來使用。而Spring的官方剛好基于RabbitMQ提供了這樣一套消息收發(fā)的模板工具:SpringAMQP。并且還基于SpringBoot對其實現(xiàn)了自動裝配,使用起來非常方便。

https://spring.io/projects/spring-amqp

SpringAMQP提供了三個功能:

  • 自動聲明隊列、交換機及其綁定關(guān)系
  • 基于注解的監(jiān)聽器模式,異步接收消息
  • 封裝了RabbitTemplate工具,用于發(fā)送消息

演示步驟:

1. 創(chuàng)建工程

包括三部分:

  • mq-demo:父工程,管理項目依賴
  • publisher:消息的發(fā)送者
  • consumer:消息的消費者

在mq-demo這個父工程中,已經(jīng)配置好了SpringAMQP相關(guān)的依賴:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>cn.itcast.demo</groupId>
    <artifactId>mq-demo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>publisher</module>
        <module>consumer</module>
    </modules>
    <packaging>pom</packaging>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.12</version>
        <relativePath/>
    </parent>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!--AMQP依賴,包含RabbitMQ-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
        <!--單元測試-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
    </dependencies>
</project>

因此,子工程中就可以直接使用SpringAMQP了。

2. 快速入門

在之前的案例中,我們都是經(jīng)過交換機發(fā)送消息到隊列,不過有時候為了測試方便,我們也可以直接向隊列發(fā)送消息,跳過交換機。
在入門案例中,我們就演示這樣的簡單模型,如圖:

也就是:

  • publisher直接發(fā)送消息到隊列
  • 消費者監(jiān)聽并處理隊列中的消息

為了方便測試,我們現(xiàn)在控制臺新建一個隊列:simple.queue

接下來,我們就可以利用Java代碼收發(fā)消息了。

3. 消息發(fā)送

首先配置MQ地址,在publisher服務(wù)的application.yml中添加配置:

spring:
  rabbitmq:
    host: 192.168.56.1 # 你的虛擬機IP
    port: 5672 # 端口
    virtual-host: /hmall # 虛擬主機
    username: hmall # 用戶名
    password: 123 # 密碼

然后在publisher服務(wù)中編寫測試類SpringAmqpTest,并利用RabbitTemplate實現(xiàn)消息發(fā)送:

package com.itheima.publisher;

import org.junit.jupiter.api.Test;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class SpringAmqpTest {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Test
    public void testSimpleQueue() {
        // 1. 隊列名
        String queueName = "simple.queue";
        // 2. 消息
        String message = "hello, spring amqp!";
        // 3. 發(fā)送消息
        rabbitTemplate.convertAndSend(queueName, message);
    }
}

打開控制臺,可以看到消息已經(jīng)發(fā)送到隊列中:


4. 消息接收

首先配置MQ地址,在consumer服務(wù)的application.yml中添加配置:

spring:
  rabbitmq:
    host: 192.168.56.1 # 你的虛擬機IP
    port: 5672 # 端口
    virtual-host: /hmall # 虛擬主機
    username: hmall # 用戶名
    password: 123 # 密碼

然后在consumer服務(wù)的com.itheima.consumer.listener包中新建一個類SpringRabbitListener,代碼如下:

@Slf4j
@Component
public class SpringRabbitListener {
    // 利用RabbitListener來聲明要監(jiān)聽的隊列信息
    // 將來一旦監(jiān)聽的隊列中有了消息,就會推送給當前服務(wù),調(diào)用當前方法,處理消息。
    // 可以看到方法體中接收的就是消息體的內(nèi)容
    @RabbitListener(queues = "simple.queue")
    public void listenSimpleQueueMessage(String msg) {
        log.info("spring 消費者接收到消息:【" + msg + "】");
    }

啟動consumer服務(wù),然后在publisher服務(wù)中運行測試代碼,發(fā)送MQ消息。最終consumer收到消息:


如果覺得有收獲,歡迎點贊和評論,更多知識,請點擊關(guān)注查看我的主頁信息哦~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容