当我们使用@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);
// 处理接收到的消息
}
测试后,正常可用。
版权归原作者 DRen1 所有, 如有侵权,请联系我们删除。