在版本 3.0.x 中将 YAML 配置与 Spring Boot AMQP 启动器一起使用时,可以省略addresses
配置属性,而是使用host
和port
。
例如:
spring:
rabbitmq:
host: "my-rmq-host.net"
username: "host_username"
password: "host_password"
port: 5672
升级到 Spring Boot 3.1.0 后,此配置选项不再起作用。该服务无法以java.lang.ArrayIndexOutOfBoundsException
.
Caused by: java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1
at org.springframework.boot.autoconfigure.amqp.PropertiesRabbitConnectionDetails.getAddresses(PropertiesRabbitConnectionDetails.java:57) ~[spring-boot-autoconfigure-3.1.0.jar:3.1.0]
at org.springframework.boot.autoconfigure.amqp.RabbitConnectionDetails.getFirstAddress(RabbitConnectionDetails.java:71) ~[spring-boot-autoconfigure-3.1.0.jar:3.1.0]
at org.springframework.boot.autoconfigure.amqp.RabbitConnectionFactoryBeanConfigurer.configure(RabbitConnectionFactoryBeanConfigurer.java:98) ~[spring-boot-autoconfigure-3.1.0.jar:3.1.0]
at org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration$RabbitConnectionFactoryCreator.rabbitConnectionFactory(RabbitAutoConfiguration.java:126) ~[spring-boot-autoconfigure-3.1.0.jar:3.1.0]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:139) ~[spring-beans-6.0.9.jar:6.0.9]
... 62 common frames omitted
其根本原因似乎在于内部RabbitConnectionFactoryBeanConfigurer
,特别是Address address = this.connectionDetails.getFirstAddress();
在我上面描述的情况下,本地RabbitConnectionDetails
类已经配置了主机、端口、用户名和密码。这些字段中的值与我上面描述的 YAML 配置匹配。看起来并public void configure(RabbitConnectionFactoryBean factory)
没有尝试使用这些值,而是要求将它们设置在Address
.由于我的应用程序 yaml 中没有address
定义此更改会导致ArrayIndexOutOfBoundsException
.
这一改变是有意为之吗?该rabbitmq.host
属性现在是否已弃用并被替换addresses
?如果是这样,该port
属性是否也已弃用?