我想使用特定模式使用队列名称,例如---
title: "Untitled"
output: bookdown::html_book
---
Table \@ref(fig:irisTab): Iris table
```{r irisTab, fig.cap="A table"}
DT::datatable(iris)
```
。为了保持这种模式的可靠性,我写了一个帮助器类来从一个简单的标识符生成这个名字。因此,project.{queue-name}.queue
会生成一个名为foo
的队列。简单。
但是,注释project.foo.queue
需要一个常量字符串,并使用我的助手类给出错误。如何使用RabbitListener
注释实现此(或可能是另一种方法)?
RabbitListener
答案 0 :(得分:6)
要创建和侦听从动态UUID构造的队列名称,可以使用random.uuid。
问题在于,由于a new random value would be generated each time the property is referenced,只能在一个地方将其捕获到Java变量中。
解决方案是使用Spring Expression Language (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
略有改动)。
答案 1 :(得分:5)
声明一个魔术豆,在这种情况下隐式命名为queueName
:
@Component
public class QueueName {
public String buildFor(String name) {
return "project."+name+".queue";
}
}
使用“常量字符串”访问此字符串,该字符串将在运行时进行评估:
@RabbitListener(queues = "#{queueName.buildFor(\"foo\")}")
答案 2 :(得分:2)
如果{queue-name}
来自yml
文件-它应该可以工作:
@RabbitListener(queues = "${queue-name}")
public void receiveMessage(FooMessage message) {
}
Spring将从application.yml
注入值。