1. 程式人生 > 其它 >SpringBoot+RabbitMQ實現訊息訂閱傳送

SpringBoot+RabbitMQ實現訊息訂閱傳送

RabbitMQ 安裝 (docker)

  1. 拉取rabbitmq映象檔案
  # 未指定版本,拉取最新版本
  root# docker pull rabbitmq
  1. 啟動映象
  root# docker run -d --hostname my-rabbit --name rabbit -p 15672:15672 -p 5672:5672 rabbitmq
  1. 配置rabbitmq外掛
  # 配置rabbitmq web管理頁面
  root# docker exec -it 容器id rabbitmq-plugins enable rabbitmq_management
  
  # 配置rabbitmq mqtt協議
  root# docker exec -it 容器id rabbitmq-plugins enable rabbitmq_mqtt

  # 如果我們需要瀏覽器通過websocket連線到rabbitmq,我們還需要啟動rabbitmq_web_mqtt外掛
  root# docker exec 容器id rabbitmq-plugins enable rabbitmq_web_mqtt

  # docker 檢視已安裝外掛
  root# docker exec rabbitmq rabbitmq-plugins list
  1. 訪問web管理頁面
    瀏覽器輸入:ip+15672

  2. 可能出現問題
    5.1 Stats in management UI are disabled on this node。

    • docker exec -it 容器id /bin/bash
    • cat /etc/rabbitmq/conf.d/management_agent.disable_metrics_collector.conf (true)
    • cd /etc/rabbitmq/conf.d/
    • echo management_agent.disable_metrics_collector = false > management_agent.disable_metrics_collector.conf (將true修改為false)
    • docker restart 容器id

SpringBoot 配置

  1. 新增pom依賴
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.3.12.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <version>2.3.12.RELEASE</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
            <version>2.3.12.RELEASE</version>
        </dependency>
  1. 新增yml配置
server:
  port: 32372
spring:
  application:
    name: spring-rabbitmq
  # rabbitmq 配置資訊
  rabbitmq:
    host: 192.168.48.132
    port: 5672
    username: guest
    password: guest
  1. 生產者
package com.ao.springrabbitmq.service.producer;

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class Producer {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    public void produce() {
        String message = "晚上加班";
        System.out.println("老闆說:" + message);
        rabbitTemplate.convertAndSend("notice_queue", message);
    }
}
  1. 消費者
package com.ao.springrabbitmq.service.consumer;

import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
public class Consumer {

    @RabbitHandler
    @RabbitListener(queuesToDeclare = @Queue("notice_queue"))
    public void process(String message) {
        System.out.println("打工人收到通知:" + message);
    }
}
  1. 測試類
package com.ao.springrabbitmq;

import com.ao.springrabbitmq.service.producer.Producer;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class RabbitMQTests {

    @Autowired
    Producer producer;

    @Test
    public void amqpTest() throws InterruptedException {
        // 生產者傳送訊息
        producer.produce();
        Thread.sleep(1000);
    }
}