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

当我们使用@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);
        // 处理接收到的消息
    }

测试后,正常可用。

本文来自网络,不代表协通编程立场,如若转载,请注明出处:https://net2asp.com/8337cbe734.html