@RabbitListener(quques=“ “)用法注意(RabbitMq)

博客指出使用@RabbitListener监听Rabbit队列消息时,注解里需常量,不能用动态变量,配置文件里的变量不可直接用,否则会报错。介绍了解决方法,即使用Spring表达式语言(SpEL)动态获取属性值注入注解,提高代码灵活性和可维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当我们使用@RabbitListener监听指定的Rabbit队列消息时。

注解里需要常量,不可以用动态变量。

所以我们在配置文件里获得的变量,不可以直接使用。

例如

@Value("${BootstrapConfig.TcpConfig.brokerId}")
private String brokerId;
@RabbitListener(queues = brokerId)

这种写法,@rabbitListener会报错,队列名字我们没有使用常量。

@RabbitListener注解中,指定的队列名称需要是常量。这意味着它必须是编译时确定的,而不能是在运行时动态计算的。

根据RabbitMQ和Spring AMQP的要求,@RabbitListener注解的queues属性需要接受一个常量,以便在应用程序启动时就能确定要监听的队列。

因此,您不能将非静态变量或在运行时动态计算的值直接传递给@RabbitListener注解的queues属性。这将导致编译错误或无法正确注册消息监听器。

解决方法:

#{${BootstrapConfig.TcpConfig.brokerId}}是Spring表达式语言(SpEL)的一种写法,用于在Spring框架中动态获取属性值。

在这种写法中,${BootstrapConfig.TcpConfig.brokerId}表示从配置文件中读取BootstrapConfig.TcpConfig.brokerId属性的值。然后,通过SpEL的#{}语法将该属性值注入到@RabbitListener注解中的队列名称中。

具体来说,#{}是SpEL表达式的起始和结束标记,$表示属性引用,${BootstrapConfig.TcpConfig.brokerId}表示要引用的属性的键。

通过使用SpEL表达式,可以在运行时动态地获取和注入属性值,而不需要使用静态变量。这样可以提高代码的灵活性和可维护性。

所以解决之后的代码变成了:

@RabbitListener(queues =RabbitMQConfig.QUEUE_NAME+"#{${BootstrapConfig.TcpConfig.brokerId}}")
    public void receiveMessage(String message) {
        System.out.println("Received message: " + message);
        // 处理接收到的消息
    }

测试后,正常可用。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值