从XML切换到.properties时,Java JMS / MQ不连接

时间:2017-09-26 13:44:50

标签: spring spring-boot jms ibm-mq application.properties

我有一个有效的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连接的东西搞砸了的结论。

0 个答案:

没有答案