Springboot+Rabbit は消費順序を保証します (単一アクティブ キュー、プロジェクトのマルチインスタンス デプロイメントの場合は 1 つのコンシューマのみ)

Rabbit は単一のライブキューを実装します

消費の順序を確保するには、1 つのインスタンスのみを順番に消費する必要があり、他のインスタンスは毎日の外部サービスを提供するだけであり、メッセージは消費しません。唯一の消費インスタンスが消費できないかオフラインの場合、次のコンシューマが自動的に消費を開始し、複数のインスタンス コンシューマのうち 1 つだけが通常に消費され、他のインスタンスは代替として使用されます。現時点ではコンシューマが使用されます单活模式

使い方は非常に簡単で、キューを宣言するときにパラメータ (arguments パラメータ) を設定し、x-single-active-consumer を True に設定するだけです。

宣言方法1(Bean):

package com.cdn.mqprovider.config.single_active;

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

import java.util.HashMap;
import java.util.Map;

/**
 * @author cdn
 * @desc
 * @date 2023/03/26 21:23
 */
@Configuration
public class SingActiveConfig {
    
    

    /**
     * @author cdn
     * @desc   单活模式队列什么
     * 这时,为了保证消费顺序,需要只有一个实例进行按
     * 顺序消费,其他实例仅提供日常对外服务,不进行消
     * 息消费。当唯一消费实例无法消费或掉线时,会自动
     * 开启下一个消费者进行消费,保证多个实例消费者中
     * 仅有一个正常消费,其他作为备选。
     * @date 2023/03/26 21:21
     */
    @Bean
    public Queue singActive() {
    
    
        Map<String, Object> arguments = new HashMap<>(2);
        arguments.put("x-single-active-consumer", true);
        return new Queue("singActive", true, false, false, arguments);
    }
}

宣言方法2(アノテーション):

package com.cdn.mqprovider.listen;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.*;
import org.springframework.stereotype.Component;

/**
 * @author cdn
 * @desc  注解式自动创建队列和交换机
 * @date 2023/03/26 21:42
 */
@Slf4j
@Component
public class SingActiveListen {
    
    

    /**
     * 单活队列:  多实例下只会有一个消费(注解式申明)
     自动创建,queue 和 exchange 绑定
     * @param msg
     */
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(value = "car",
                    arguments = {
    
    
                            @Argument(name = "x-single-active-consumer", value = "true", type = "java.lang.Boolean")
                    }),
            key = "carKey",
            exchange = @Exchange(value = "carExchange", type = "direct")
    ))
    public void car2(String msg){
    
    
        System.out.println("-------car--------" + msg);
    }
}

おすすめ

転載: blog.csdn.net/caidingnu/article/details/129786332