繁体   English   中英

RabbitListener 注释上的动态队列

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM