[英]Dynamic Queues on RabbitListener Annotation
我想使用特定模式的队列名称,例如project.{queue-name}.queue
。 为了保持这种模式稳固,我编写了一个辅助类来从一个简单的标识符生成这个名称。 因此, foo
会生成一个名为project.foo.queue
的队列。 简单。
但是,注释RabbitListener
需要一个常量字符串,并在使用我的助手类时给我一个错误。 我怎样才能使用RabbitListener
注释来实现这个(或者可能是另一种方法)?
@Component
public class FooListener {
// it doesn't work
@RabbitListener(queues = QueueName.for("foo"))
// it works
@RabbitListener(queues = "project.foo.queue")
void receive(final FooMessage message) {
// ...
}
}
要创建和侦听从动态 UUID 构造的队列名称,您可以使用random.uuid 。
问题是这必须只在一个地方被捕获到 Java 变量中,因为每次引用该属性时都会生成一个新的随机值。
解决方案是使用Spring 表达式语言 (SpEL)调用提供配置值的函数,例如:
@RabbitListener(queues = "#{configureAMQP.getControlQueueName()}")
void receive(final FooMessage message) {
// ...
}
使用以下内容创建队列:
@Configuration
public class ConfigureAMQP {
@Value("${controlQueuePrefix}-${random.uuid}")
private String controlQueueName;
public String getControlQueueName() {
return controlQueueName;
}
@Bean
public Queue controlQueue() {
System.out.println("controlQueue(): controlQueueName=" + controlQueueName);
return new Queue(controlQueueName, true, true, true);
}
}
请注意,SpEL 中使用的必要 bean 是基于@Configuration
类隐式创建的(稍微改变了拼写ConfigureAMQP
-> configureAMQP
)。
声明一个魔豆,在本例中隐式命名为queueName
:
@Component
public class QueueName {
public String buildFor(String name) {
return "project."+name+".queue";
}
}
使用将在运行时评估的“常量字符串”访问它:
@RabbitListener(queues = "#{queueName.buildFor(\"foo\")}")
如果{queue-name}
来自yml
文件 - 它应该可以工作:
@RabbitListener(queues = "${queue-name}")
public void receiveMessage(FooMessage message) {
}
Spring 将从application.yml
注入值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.