如何在 spring boot rest 中创建特定于实例的消息队列 api

How to create instance specific message queues in springboot rest api

我有许多微服务,每个 运行 在负载平衡环境中都在自己的容器中。我需要这些微服务的每个实例在启动时创建一个 rabbitmq 队列,并在它停止时删除它。我目前在我的应用程序属性文件中定义了以下 属性:

config_queue: config_${PID}

我的消息队列侦听器如下所示:

public class ConfigListener {
    Logger logger = LoggerFactory.getLogger(ConfigListener.class);

    // https://www.programcreek.com/java-api-examples/index.php?api=org.springframework.amqp.rabbit.annotation.RabbitListener
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(value = "${config_queue}",
                    autoDelete = "true"),
                    exchange = @Exchange(value = AppConstants.TOPIC_CONFIGURATION,
                    type= ExchangeTypes.FANOUT)
    ))
    public void configChanged(String message){
        ... application logic
    }
}

当我 运行 微服务时,这一切都很好用。创建一个带有前缀配置和进程 ID 的队列,并在我停止服务时自动删除。

但是,当我 运行 此服务和其他服务在各自的 docker 容器中时,所有服务都具有相同的 PID,即 1。

有没有人知道我如何创建指定该实例唯一的队列。

在此先感谢您的帮助。

改用AnonymousQueue

@SpringBootApplication
public class So72030217Application {

    public static void main(String[] args) {
        SpringApplication.run(So72030217Application.class, args);
    }

    @RabbitListener(queues = "#{configQueue.name}")
    public void listen(String in) {
        System.out.println(in);
    }

}

@Configuration
class Config {

    @Bean
    FanoutExchange fanout() {
        return new FanoutExchange("config");
    }

    @Bean
    Queue configQueue() {
        return new AnonymousQueue(new Base64UrlNamingStrategy("config_"));
    }

    @Bean
    Binding binding() {
        return BindingBuilder.bind(configQueue()).to(fanout());
    }

}

AnonymousQueues 是 auto-delete 并在名称中使用 Base64 编码的 UUID。