我有一个有效的Spring Boot应用程序,它使用MQQueueConnectionFactory初始化与MQ服务器的连接。
在我的applicationContext.xml中,我连接了一个与此相当的自定义配置类:
repository.findByLocations(List<Location> locations)
我是通过@ImportResource加载applicationContext(“classpath:applicationContext.xml”)
一切正常,它将通过MQ服务器发送和接收消息。
然后我决定取消我的applicationContext.xml(无论如何,mqConfiguration bean是唯一的东西)并将MqConfiguration的连接移动到我的application.properties文件中。
所以,我的基本策略是将以下内容添加到我的application.properties中:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<bean id="mqConfiguration" class="com.myapp.MqConfiguration">
<property name="host" value="127.0.0.1" />
<property name="port" value="3005" />
<property name="username" value="joe" />
<property name="password" value="mypassword" />
<property name="queueManager" value="QUEUE_MANAGER_NAME" />
<property name="channel" value="SERVER_CHANNEL" />
<property name="sendQueue" value="OUTBOUND_QUEUE_NAME" />
<property name="receiveQueue" value="INBOUND_QUEUE_NAME" />
</bean>
</beans>
然后我删除了ImportResource指令并添加了以下注释:
configuration.mq.host="127.0.0.1"
configuration.mq.port="3005"
etc.
然后,在MqConfiguration类中,我使用@Value将application.properties值连接到MqConfiguration类,如下所示:
@PropertySources( {
@PropertySource( value = "classpath:application.properties" )
})
进行此更改后,我的Java代码突然无法连接到MQ(MQ以MQRC_HOST_NOT_AVAILABLE响应,我的发送和响应导致异常)。
这是非常特殊的,因为我可以证明MQQueConnectionFactory bean正在接收application.properties中提供的值。看一下MQQueueConnectionFactory bean:
public class MqConfiguration {
@Value( "${configuration.mq.host}" ) private String host;
@Value( "${configuration.mq.port}" ) private Integer port;
etc.
这是初始化连接的bean的基本布局:
public static MQQueueConnectionFactory mqQueueConnectionFactory( MqConfiguration mqConfiguration ) {
(...ommitted..)
System.out.println( mqConfiguration.getHost ); // this is 127.0.0.1.. proving we got the value from application.properties
mqConnectionFactory.setHostName( mqConfiguration.getHost() );
(...ommitted..)
}
}
以下是我使用JmsOperations对象发送和接收的方式:
@Bean
public static MQQueueConnectionFactory mqQueueConnectionFactory( MqConfiguration mqConfiguration )
@Bean
UserCredentialsConnectionFactoryAdapter userCredentialsConnectionFactoryAdapter( MQQueueConnectionFactory mqQueueConnectionFactory ) {
@Bean
@Primary
public CachingConnectionFactory cachingConnectionFactory( UserCredentialsConnectionFactoryAdapter userCredentialsConnectionFactoryAdapter )
@Bean
public JmsOperations jmsOperations( CachingConnectionFactory cachingConnectionFactory )
对此有什么看法?看起来令人难以置信的是,通过application.properties与applicationContext.xml进行切换会产生任何不同,特别是如果相同的实际值来自任何一个源。但不知何故,当相同的值来自application.properties时,我无法逃避有关MQ连接的东西搞砸了的结论。