QPID连接工厂属性

时间:2018-10-23 10:24:57

标签: apache-camel jms amqp qpid spring-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>

1 个答案:

答案 0 :(得分: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>

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