我有許多微服務,每個微服務都在負載平衡環境中的自己的容器中運行。我需要這些微服務的每個實體在啟動時創建一個 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。
有誰知道我如何創建指定該實體唯一的佇列。
在此先感謝您的幫助。
uj5u.com熱心網友回復:
改為使用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 是自動洗掉的,并在名稱中使用 Base64 編碼的 UUID。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/466491.html
