RabbitListener注释上的动态队列

时间:2018-04-18 22:20:29

标签: java spring rabbitmq

我想使用特定模式使用队列名称,例如--- 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

3 个答案:

答案 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注入值。