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);
}
}