Свойства фабрики соединений QPID - PullRequest
0 голосов
/ 23 октября 2018

Моя система основана на верблюде и использует 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, который, в свою очередь, используется внутри 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 голосов
/ 23 октября 2018

Короткий ответ - нет, это все, что поддерживает этот класс.Однако вы можете написать компонент конфигурации, который имеет требуемые свойства и создать компонент.Вверху моей головы, что-то вроде этого:

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

При желании вы также можете использовать зашифрованные заполнители свойств.

...