#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}"))