我有一个工作的 Spring Boot 应用程序,它使用 MQQueueConnectionFactory 来初始化与 MQ 服务器的连接。
在我的 applicationContext.xml 中,我连接了一个与此等效的自定义配置类:
<?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("classpath:applicationContext.xml") 加载 applicationContext
一切正常,它将通过 MQ 服务器发送和接收消息。
然后我决定删除我的 applicationContext.xml(无论如何,mqConfiguration bean 是其中唯一的东西)并将 MqConfiguration 的连线移动到我的 application.properties 文件中。
因此,我的基本策略是将以下内容添加到我的 application.properties 中:
configuration.mq.host="127.0.0.1"
configuration.mq.port="3005"
etc.
然后我删除了 ImportResource 指令并添加了以下注释:
@PropertySources( {
@PropertySource( value = "classpath:application.properties" )
})
然后,在 MqConfiguration 类中,我使用 @Value 将 application.properties 值连接到 MqConfiguration 类中,如下所示:
public class MqConfiguration {
@Value( "${configuration.mq.host}" ) private String host;
@Value( "${configuration.mq.port}" ) private Integer port;
etc.
进行此更改后,我的 Java 代码突然无法连接到 MQ(MQ 以 MQRC_HOST_NOT_AVAILABLE 响应,我的发送和响应导致异常)。
这对我来说非常特殊,因为我可以证明 MQQueConnectionFactory bean 正在接收 application.properties 中提供的值。看一下 MQQueueConnectionFactory 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..)
}
}
这是初始化连接的bean的基本布局:
@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 )
以下是我使用 JmsOperations 对象发送和接收的方法:
public Object receiveMessage( MqConfiguration mqConfiguration ) throws JmsException {
System.out.println( mqConfiguration.getReceiveQueue() ); // this is the proper value: INBOUND_QUEUE_NAME
return jmsOperations.receiveAndConvert( mqConfiguration.getReceiveQueue() );
}
public boolean sendMessage( String message, MqConfiguration mqConfiguration ) {
JmsTemplate jmsTemplate = ( JmsTemplate ) jmsOperations;
System.out.println( mqConfiguration.getSendQueue() ); // this is the proper value: OUTBOUND_QUEUE_NAME
MQQueue destinationQueue = jmsOperations.execute( executeSession -> MqQueueUtils.resolveQueue( jmsTemplate, executeSession, mqConfiguration.getSendQueue() ) );
jmsOperations.convertAndSend( destinationQueue, message );
return true;
}
对这个有什么想法吗?通过 application.properties 与 applicationContext.xml 切换接线似乎令人难以置信,特别是如果来自任一来源的相同实际值。但不知何故,我无法逃避这样的结论,即当相同的值来自 application.properties 时,MQ 连接会变得混乱。