Параметр динамического объекта в URL конечной точки потребителя camel

#java #spring #apache-camel

#java #весна #apache-camel

Вопрос:

Я использую camel с spring. Один из наших маршрутов должен отправлять TCP-сообщение динамически выбранной конечной точке. Поскольку конечная точка — это просто строка, я знаю, что могу использовать

 .toD("netty4://...")
  

но проблема заключается в настройке параметров ssl.

Компонент Netty определяет это как параметр URL-адреса маршрута, поэтому он выглядит следующим образом:

 .toD("netty4://...?sslContextParameters=mySslContextParameters");
  

и для выполнения этой работы у меня есть компонент:

 @Bean
public SslContextParameters mySslContextParameters() {
    ...
    return sslContextParameters();
}
  

Это привязывает его к этому единственному экземпляру компонента, но то, что мне нужно, — это динамически настроенный компонент, чтобы я мог устанавливать различные параметры SSL на основе некоторых данных, которые я получаю от производителя.

Я хотел бы что-то вроде этого (я знаю, что это неправильный синтаксис camel), когда я мог бы вызвать фабричный метод и передать ему некоторые параметры:

 .toD("netty://...?sslContextParameters=${bean('mySslContestParameters(${exchange.param1}, ${exchange.param2}')}");
  

Комментарии:

1. Вы изучали привязку к компонентам? camel.apache.org/bean.html

2. Можете ли вы привести мне пример, как использовать привязку к компоненту, чтобы я мог передавать параметры этому методу bean factory?

Ответ №1:

Вы можете использовать EIP списка получателей в соответствии с этим часто задаваемым вопросом camel.

Ответ №2:

Вы можете использовать EIP списка получателей в соответствии с этим часто задаваемым вопросом camel.

Спасибо, Стив, это был хороший совет.

У меня был аналогичный вопрос, я воспользовался вашим советом, и это сработало!

В моем camel-context.xml , я определяю два параметра sslContextParameters

 ...
<camel:sslContextParameters id="firstSsl">
    <camel:keyManagers keyPassword="changeit">
        <camel:keyStore resource="/test/client.keystore.jks" password="changeit" />
    </camel:keyManagers>
    <camel:trustManagers>
            <camel:keyStore resource="/test/client.truststore.jks" password="changeit" />
    </camel:trustManagers>
</camel:sslContextParameters>
<camel:sslContextParameters id="secondSsl">
    <camel:keyManagers keyPassword="otherpassword">
        <camel:keyStore resource="/test/other-keystore.jks" password="otherpassword" />
    </camel:keyManagers>
    <camel:trustManagers>
        <camel:keyStore resource="/test/other-truststore.jks" password="otherpassword" />
    </camel:trustManagers>
</camel:sslContextParameters>
...
  

В моем RouteBuilder

 .setHeader("sslContext", constant("firstSsl"))
//or
.setHeader("sslContext", constant("secondSsl"))
...
.recipientList(simple("https4://override/?bridgeEndpoint=falseamp;sslContextParametersRef=${headers.sslContext}"))