0

我有一个工作的 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 连接会变得混乱。

4

0 回答 0