Springboot + rabbitMq佇列

Hello霖發表於2024-04-01

1.linux上直接拉個mq映象,直接啟動,設定了映象名my-rabbitmq, 設定埠對映出去,設定賬號和密碼為admin

docker run -d --name my-rabbitmq -p 5672:5672 -p 15672:15672 -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin rabbitmq:3

2.開啟視覺化介面

先進入容器內部

docker exec -it my-rabbitmq bash

然後啟動介面

rabbitmq-plugins enable rabbitmq_management

訪問:地址:15672 登入即可。

Springboot + rabbitMq佇列

3.springboot中使用

安裝依賴

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

配置檔案

spring:
  rabbitmq:
    host: 192.168.17.13 # RabbitMQ伺服器地址
    port: 5672       # RabbitMQ伺服器埠
    username: admin  # 預設使用者名稱
    password: admin  # 預設密碼
    virtual-host: /  # 虛擬主機

寫配置類:

@Configuration
public class RabbitMQConfig {

    // 定義佇列
    @Bean
    public Queue queue() {
        return new Queue("myQueue", true);
    }
    
    //可以定義多個佇列
    // 定義第二個佇列
    @Bean
    public Queue queue2() {
        return new Queue("myQueue2", true);
    }

    // 定義第三個佇列
    @Bean
    public Queue queue3() {
        return new Queue("myQueue3", true);
    }
    

    // 定義交換機
    @Bean
    public TopicExchange exchange() {
        return new TopicExchange("myExchange");
    }

    // 繫結佇列和交換機
    @Bean
    public Binding binding(Queue queue, TopicExchange exchange) {
        return BindingBuilder.bind(queue).to(exchange).with("myRoutingKey");
    }
    
    // 繫結佇列和交換機佇列2的
    @Bean
    public Binding bindingQueue2(Queue queue2, TopicExchange exchange) {
        return BindingBuilder.bind(queue2).to(exchange).with("myRoutingKey2");
    }
    
}

定義佇列

@Bean public Queue queue() {

  return new Queue("myQueue", true);

}

  • 第一個引數"myQueue"是佇列的名稱,這是一個自定義的識別符號,用於唯一標識這個佇列。
  • 第二個引數true表示這個佇列是持久化的,即在RabbitMQ伺服器重啟後,佇列依然存在,不會丟失資料。

定義交換機

@Bean public TopicExchange exchange() {

  return new TopicExchange("myExchange");
}

建立一個名為myExchange的主題交換機(Topic Exchange)例項。

  • TopicExchange是一種交換機型別,它使用主題(Topic)進行訊息路由。生產者傳送訊息時,可以指定一個路由鍵,消費者可以根據自己的需求訂閱匹配特定模式的訊息。
  • 交換機名稱"myExchange"是自定義的,用於標識這個交換機。

繫結佇列和交換機

@Bean public Binding binding(Queue queue, TopicExchange exchange) {

  return BindingBuilder.bind(queue).to(exchange).with("myRoutingKey");
}

這個方法建立了一個繫結例項,它定義瞭如何將佇列繫結到交換機,並指定了路由鍵。

  • BindingBuilder是RabbitMQ提供的一個工具類,用於構建繫結關係。
  • bind(queue)方法指定了要繫結的佇列。
  • to(exchange)方法指定了要繫結到的交換機。
  • with("myRoutingKey")方法指定了路由鍵。在這個例子中,所有的路由鍵都是"myRoutingKey"。這意味著只有當訊息的路由鍵是"myRoutingKey"時,交換機才會將訊息路由到這個佇列。

配置完了,現在去寫生產者程式碼,也就是發訊息到mq上的程式碼

convertAndSend方法要把剛配置類的交換機和路由鍵填上。

@Component
public class MessageSender {

    private final RabbitTemplate rabbitTemplate;

    @Autowired
    public MessageSender(RabbitTemplate rabbitTemplate) {
        this.rabbitTemplate = rabbitTemplate;
    }

    public void send(String message) {
        rabbitTemplate.convertAndSend("myExchange", "myRoutingKey", message);
    }
}

現在寫消費者程式碼,也就是接收到訊息後的處理

指定監控哪個佇列,然後獲取的資訊列印出來,或者做其它處理。

@Component
public class MessageReceiver {

    @RabbitListener(queues = "myQueue")
    public void receive(String message) {
        System.out.println("Received message: " + message);
    }
}

相關文章