@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://www.net2asp.com/8337cbe734.html
