2025/06/23

Spring Boot 3 amqp

RabbitMQ 重要元件有

  • ConnectionFactory

  • Channel: 發送訊息

  • Exchange: 交換器,分發訊息

  • Queue: 儲存 producer 發送的訊息

  • RoutingKey: exchange 把 producer 的訊息寫入不同的 queue

  • BindingKey: exchange 綁定到不同的 queue

exchange 支援的訊息模式:

  • direct

    預設 路由模式。發送訊息到指定的 Routing Key,寫入不同的 queue

  • fanout

    廣播模式。將訊息送到綁定的所有 queues 裡面。性能最好,最常用

  • headers

    匹配模式。根據訊息的 header 跟 queue 的參數匹配。性能差,少用

  • topic

    匹配模式。可使用 * 匹配


rabbitmq cli 設定新增 user

rabbitmqctl add_user admin password
rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
rabbitmqctl set_user_tags admin administrator
rabbitmqctl delete_user guest
rabbitmqctl list_users

pom.xml

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>

org.springframework.boot.autoconfigure.AutoConfiguration.imports 註冊

RabbitAutoConfiguration。參數綁定類別為 RabbitProperties。參數為 spring.rabbitmq.*

application.yml

spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: admin
    password: password

也可以設定為 uri 形式

spring:
  rabbitmq:
    addresses: "amqp://admin:password@localhost"

MsgController.java

package com.test.amqp;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RequiredArgsConstructor
@RestController
@Slf4j
public class MsgController {

    private final RabbitTemplate rabbitTemplate;

    /**
     * send message: Direct mode
     * @param msg
     * @return
     */
    @RequestMapping("/send")
    public String sendMsg(@RequestParam("msg") String msg) {
        rabbitTemplate.convertAndSend("test-direct-exchange",
                "test-direct-routing-key", msg);
        return "message sent";
    }

    /**
     * receive message: Direct Mode
     * @param msg
     */
    @RabbitListener(queues = "test-direct-queue")
    public void receiveMsg(String msg) {
        log.info("message received:{}", msg);
    }

}

RabbitMQ 無法自動產生 queue, exchange。除了能在 web console 設定,也可以透過程式設定

package com.test.amqp;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitMQConfig {

    /**
     * create queue: Direct Mode
     * @return
     */
    @Bean
    public Queue testDirectQueue() {
        return new Queue("test-direct-queue");
    }

    /**
     * create exchange: Direct Mode
     * @return
     */
    @Bean
    public DirectExchange TestDirectExchange() {
        return new DirectExchange("test-direct-exchange");
    }

    /**
     * create routing key: Direct Mode
     * @param testDirectQueue
     * @return
     */
    @Bean
    public Binding testDirectBinding(Queue testDirectQueue) {
        return BindingBuilder.bind(testDirectQueue)
                .to(TestDirectExchange()).with("test-direct-routing-key");
    }

}

測試

http://localhost:8080/send?msg=test1234

沒有留言:

張貼留言