1. 程式人生 > 實用技巧 >SpringBoot整合RabbitMQ 通俗易懂 超詳細 【內含案例】

SpringBoot整合RabbitMQ 通俗易懂 超詳細 【內含案例】

SpringBoot結合RabbitMq

SpringBoot 框架部署

HelloWorld 簡單模式

Topic 萬用字元模式

一、SpringBoot 框架部署

1.建立Maven工程(我用的IDEA)

File[檔案] -> New[新建] -> Project[工程] -> Maven[選擇Maven] -> Next[直接下一步] -> Name[輸入專案名稱] —> Finish[完成]

2.在專案裡建立兩個子工程

Producer 訊息生產者

專案名稱位置右鍵 -> New[新建] -> Module[元件] -> Maven[選擇Maven] -> Next[下一步] -> Name[輸入Producer] —> Finish[完成]

Consumer 訊息消費者

專案名稱位置右鍵 -> New[新建] -> Module[元件] -> Maven[選擇Maven] -> Next[下一步] -> Name[輸入Consumer] —> Finish[完成]

3.在主專案工程的pom檔案裡填寫依賴(注意是主專案 兩個子專案會繼承父專案的依賴)

<!--Spring Boot依賴-->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.8.RELEASE</version>
</parent>
<dependencies>
    <!--spring-boot-starter-amqp依賴 [重要]-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-amqp</artifactId>
        <version>2.2.8.RELEASE</version>
    </dependency>
    
    <!--下面三個依賴是為了方便控制檯輸出Log [一般]-->
    <!--junit:junit 單元測試框架 用了都說好-->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13</version>
    </dependency>
    
    <!--org.projectlombok:lombok 整合註解-->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.12</version>
    </dependency>
    
    <!--ch.qos.logback:logback-classic 日誌框架-->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.3</version>
    </dependency>
    
    <!--spring-boot-starter-test SpringBootTest-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <version>2.2.8.RELEASE</version>
    </dependency>
</dependencies>

4.分別在兩個子專案中建立application.yml檔案

注意.yml檔案需下載 YAML 外掛

resource資料夾右鍵 -> New[新建] -> File[檔案] -> Name[輸入application.yml] —> Finish[完成]

spring:
  rabbitmq:
    host: localhost
    port: 5672
    virtual-host: /
    username: username 改成你自己的賬號
    password: password 改成你自己的密碼
server:
  port: 伺服器埠號 兩個子工程不能一致

5.Producer生產者建立啟動類

Java資料夾右鍵 -> New[新建] -> Java Class[類檔案] -> Name[com.rabbit.producer.ProviderRabbitApplication.java] —> Finish[完成]

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * 生產者啟動類
 */
@SpringBootApplication
public class ProviderRabbitApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProviderRabbitApplication.class,args);
    }
}

6.Consumer生產者建立啟動類

Java資料夾右鍵 -> New[新建] -> Java Class[類檔案] -> Name[com.rabbit.consumer.ConsumerRabbitMqApplication.java] —> Finish[完成]

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * 消費者啟動類
 */
@SpringBootApplication
public class ConsumerRabbitMqApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerRabbitMqApplication.class,args);
    }
}

二、HelloWorld 簡單模式

1.建立RabbitMqConfig.java檔案 繫結交換機和佇列

Java資料夾右鍵 -> New[新建] -> Java Class[類檔案] -> Name[com.rabbit.producer.config.RabbitMqConfig.java] —> Finish[完成]

import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * RabbitMq 配置類
 */
@Configuration
public class RabbitMqConfig {
    public static final String SIMPLE_EXCHANGE_NAME = "simple_exchange";
    public static final String SIMPLE_QUEUE_NAME = "simple_queue";

    /**
     * 建立 交換機
     * @return
     */
    @Bean
    public Exchange simpleExchange(){
        return ExchangeBuilder.topicExchange(SIMPLE_EXCHANGE_NAME).build();
    }

    /**
     * 建立 佇列
     * @return
     */
    @Bean
    public Queue simpleQueue(){
        return QueueBuilder.durable(SIMPLE_QUEUE_NAME).build();
    }

    /**
     * 繫結 交換機與佇列
     * @param exchange
     * @param queue
     * @return
     */
    @Bean
    public Binding itemQueueExchange(@Qualifier("simpleExchange") Exchange exchange, @Qualifier("simplQueue") Queue queue){
        return BindingBuilder.bind(queue).to(exchange).with("").noargs();
    }
}

2.建立ConsumerListener.java監聽訊息檔案

Java資料夾右鍵 -> New[新建] -> Java Class[類檔案] -> Name[com.rabbit.cosnumer.listener.ConsumerListener.java] —> Finish[完成]


import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import lombok.extern.slf4j.Slf4j;

@Component
@Slf4j
public class ConsumerListener {
    /**
     * 監聽某個佇列的訊息
     * @param message 接收到的訊息
     */
    @RabbitListener(queuesToDeclare = "simple_queue")
    public void myListener(String message){
        //不用在手動轉UTF-8 Spring自動轉好了
        log.debug("消費者接收到的訊息為:{}", message);
    }
}

3.建立ProducerTest.java測試檔案

test->java資料夾右鍵 -> New[新建] -> Java Class[類檔案] -> Name[com.rabbit.producer.test.ProducerTest.java] —> Finish[完成]

import lombok.extern.slf4j.Slf4j;
import com.itheima.rabbitmq.config.RabbitMQConfig;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;

@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class RabbitMQTest {

    @Resource
    private RabbitTemplate rabbitTemplate;

    @Test
    public void sendTest(){
        rabbitTemplate.convertAndSend(RabbitMqConfig.TOPIC_EXCHANGE_NAME,"","測試 SpringBoot整合RabbitMq的普通模式");
    }
}

4.測試

首先執行一次ProducerTest.java測試類 建立交換機和佇列

然後在啟動消費者監聽器

三、Topic 萬用字元模式

1.建立RabbitMqConfig.java檔案 繫結交換機和佇列

Java資料夾右鍵 -> New[新建] -> Java Class[類檔案] -> Name[com.rabbit.producer.config.RabbitMqConfig.java] —> Finish[完成]

import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * RabbitMq 配置類
 */
@Configuration
public class RabbitMqConfig {
    private static final String TOPIC_EXCHANGE_NAME = "topic_exchange";
    private static final String TOPIC_QUEUE_NAME = "topic_queue";

    /**
     * 建立 交換機
     * @return
     */
    @Bean
    public Exchange itemTopicExchange(){
        return ExchangeBuilder.topicExchange(TOPIC_EXCHANGE_NAME).build();
    }

    /**
     * 建立 佇列
     * @return
     */
    @Bean
    public Queue itemQueue(){
        return QueueBuilder.durable(TOPIC_QUEUE_NAME).build();
    }

    /**
     * 繫結 交換機與佇列
     * @param exchange
     * @param queue
     * @return
     */
    @Bean
    public Binding itemQueueExchange(@Qualifier("itemTopicExchange") Exchange exchange, @Qualifier("itemQueue") Queue queue){
        return BindingBuilder.bind(queue).to(exchange).with("item.#").noargs();
    }

}

2.建立ConsumerListener.java監聽訊息檔案

Java資料夾右鍵 -> New[新建] -> Java Class[類檔案] -> Name[com.rabbit.cosnumer.listener.ConsumerListener01.java] —> Finish[完成]


import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import lombok.extern.slf4j.Slf4j;

@Component
@Slf4j
public class ConsumerListener {
    /**
     * 監聽某個佇列的訊息
     * @param message 接收到的訊息
     */
    @RabbitListener(queuesToDeclare = "topic_queue")
    public void myListener(String message){
        //不用在手動轉UTF-8 Spring自動轉好了
        log.debug("消費者接收到的訊息為:{}", message);
    }
    
}

3.建立ProducerTest.java測試檔案

test->java資料夾右鍵 -> New[新建] -> Java Class[類檔案] -> Name[com.rabbit.producer.test.ProducerTest.java] —> Finish[完成]

import lombok.extern.slf4j.Slf4j;
import com.itheima.rabbitmq.config.RabbitMQConfig;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;

@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class RabbitMQTest {

    @Resource
    private RabbitTemplate rabbitTemplate;

    @Test
    public void sendTest(){
        rabbitTemplate.convertAndSend(RabbitMqConfig.TOPIC_EXCHANGE_NAME,"item.insert","topic萬用字元模式,RoutingKey:item.insert");
        rabbitTemplate.convertAndSend(RabbitMqConfig.TOPIC_EXCHANGE_NAME,"item.delete.yes","topic萬用字元模式,RoutingKey:item.delete.yes");
        rabbitTemplate.convertAndSend(RabbitMqConfig.TOPIC_EXCHANGE_NAME,"null.null","topic萬用字元模式,RoutingKey:null.null");
    }
}

4.測試

首先執行一次ProducerTest.java測試類 建立交換機和佇列

然後在啟動消費者監聽器