如何在 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());
}
}
AnonymousQueue
s 是 auto-delete 并在名称中使用 Base64 编码的 UUID。
我有许多微服务,每个 运行 在负载平衡环境中都在自己的容器中。我需要这些微服务的每个实例在启动时创建一个 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());
}
}
AnonymousQueue
s 是 auto-delete 并在名称中使用 Base64 编码的 UUID。