【问题标题】:QPID Connection factory propertiesQPID 连接工厂属性
【发布时间】:2019-03-27 13:18:41
【问题描述】:

我的系统是基于camel的,使用Apache QPID 0.37.0来消费来自远程AMQPS服务器的消息。我们的系统通过客户端证书进行身份验证。因此我有这样的配置:

<bean id="jmsConnectionFactory" class="org.apache.qpid.jms.JmsConnectionFactory">
    <constructor-arg name="remoteURI" value="amqps://some-location:5671?transport.keyStoreLocation=/very/long/path/nnn-openssl.p12&amp;transport.keyStorePassword=*******&amp;transport.trustStoreLocation=/very/long/path/server.keystore&amp;transport.trustStorePassword=*******"/>
</bean>

这一切正常。但是,以这种方式(即在 URI 中)配置密钥/信任存储有几个缺点:

  • 首先,它不易阅读和维护。
  • 某些组件会记录 URI,因此路径(我可以接受)和密码(哎呀...)会被记录。

我知道可以通过系统属性(javax.net.ssl.keyStore 等)进行配置,但这不是一个选项,因为不同的模块可能使用不同的密钥和信任库,我们希望将它们保存在单独的文件中。

有没有办法以不同的方式配置 JmsConnectionFactory 的那些传输属性?

类似:

<bean id="jmsConnectionFactory" class="org.apache.qpid.jms.JmsConnectionFactory">
    <constructor-arg name="remoteURI" value="amqps://some-location:5671"/>
    <property name="transport.keyStoreLocation" value="/very/long/path/nnn-openssl.p12"/>
    ...
</bean>

请注意,该工厂用于 JMSConfig,而 JMSConfig 又用于 AMQPComponent:

<bean id="jmsConfig" class="org.apache.camel.component.jms.JmsConfiguration" >
    <property name="connectionFactory" ref="jmsConnectionFactory" />
    ...
</bean>

<bean id="amqp" class="org.apache.camel.component.amqp.AMQPComponent">
    <property name="testConnectionOnStartup" value="true"/>
    <property name="configuration" ref="jmsConfig" />
    ...
</bean>

【问题讨论】:

    标签: apache-camel jms amqp qpid spring-camel


    【解决方案1】:

    简短的回答是否定的,这就是该类所支持的全部。但是,您可以编写一个具有您需要的属性的配置 bean,并让它创建 bean。在我的脑海中,是这样的:

    @Configuration
    public class QpidConfiguration {
    
        // Add setters for these
        private String host;
        private int port = 5671;
        private String keyStore;
        private String keyStorePassword;
        private String trustStoreLocation;
        private String trustStorePassword;
    
        @Bean
        public JmsConnectionFactory createConnectionFactory() {
            return new JmsConnectionFactory("amqps://" + host" + ":" + port + "?transport.keyStoreLocation=" + keyStoreLocation + "&transport.keyStorePassword=" + keyStorePassword + "&transport.trustStoreLocation=" + trustStoreLocation + "&transport.trustStorePassword=" + trustStorePassword);
        }
    }
    

    您可能希望在其中添加一些参数验证以确保安全。

    然后您可以使用更方便的属性来定义 bean。

    <bean id="jmsConnectionFactory" class="com.example.QpidConfiguration">
        <property name="host" value="some-location"/>
        <property name="keyStoreLocation" value="/very/long/path/nnn-openssl.p12"/>
        ...
    </bean>
    

    如果您愿意,您还可以利用加密的属性占位符。

    【讨论】:

    • 这是一个有趣的解决方案,但它并不能完全满足我的需求:我仍然会得到一个包含我的路径和密码的丑陋且非常长的 remoteURI。并且该 URI 记录在 JMSConnection 中。还是投了赞成票。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-18
    • 1970-01-01
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 2021-03-03
    相关资源
    最近更新 更多