Apache camel QPID连接工厂属性

Apache camel QPID连接工厂属性,apache-camel,jms,amqp,qpid,spring-camel,Apache Camel,Jms,Amqp,Qpid,Spring Camel,我的系统基于camel,用于消费来自远程AMQPS服务器的消息。我们的系统通过客户端证书进行身份验证。因此,我有一个配置: <bean id="jmsConnectionFactory" class="org.apache.qpid.jms.JmsConnectionFactory"> <constructor-arg name="remoteURI" value="amqps://some-location:5671?transport.keyStoreLocatio

我的系统基于camel,用于消费来自远程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>
请注意,此工厂用于JMSConfig,而JMSConfig又用于AMQP组件:

<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>

...
...

简短的回答是否定的,这就是类所支持的全部内容。但是,您可以编写一个具有所需属性的配置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中。不管怎样,我还是投了赞成票。
<bean id="jmsConnectionFactory" class="com.example.QpidConfiguration">
    <property name="host" value="some-location"/>
    <property name="keyStoreLocation" value="/very/long/path/nnn-openssl.p12"/>
    ...
</bean>