Почему мой условный маршрут Apache Camel всегда выполняет первую опцию?
У меня есть маршрут Camel, который (помимо прочего) должен запускать валидатор, но только если определенное свойство установлено, а именно com.acme.ValidatorOn
,
Соответствующая часть маршрута выглядит так:
<choice>
<when>
<simple>{{com.acme.ValidatorOn}} == true</simple>
<to uri="validator:MyWebService.xsd" />
</when>
</choice>
Когда я заметил, что валидатор ВСЕГДА выполнялся, даже когда свойство было установлено на false
Я начал экспериментировать с условием.
<choice>
<when>
<simple>{{com.blahblahthiswillnotwork.ValidatorOn}} == true</simple>
<to uri="validator:MyWebService.xsd" />
</when>
</choice>
Даже с поддельным именем свойства валидатор все еще выполнялся. Так что я взял это дальше, а также добавил <otherwise>
:
<choice>
<when>
<simple>5 == 6</simple>
<log message="first choice" />
</when>
<otherwise>
<log message="second choice"/>
</otherwise>
</choice>
Это печатает "первый выбор". Независимо от того, какое выражение я положил в <simple>
, первый выбор выполнен. Я пробовал выражения, которые явно не соответствуют действительности, такие как 'foo' == 'bar'
и даже просто бред.
Я просмотрел документацию Camel о маршрутизации на основе содержимого, и, похоже, в настройке этой процедуры нет ошибки. Я использую Camel 2.8.1 и Java 8 update 45.
Ниже приведен полный маршрут, на случай, если в маршруте может быть что-то еще, что портит это (имена были изменены, чтобы защитить невинных):
<route autoStartup="false" id="com.acme.doStuffRoute">
<from uri="spring-ws:rootqname:{namepace}doStuff?endpointMapping=#com.acme.EndpointMapping"/>
<setHeader headerName="Exchange.HTTP_QUERY">
<simple>certainProperty=${ref:certainProperty}</simple>
</setHeader>
<setHeader headerName="CamelHttpMethod">
<constant>POST</constant>
</setHeader>
<policy ref="com.acme.Administrators">
<choice>
<when>
<simple>{{com.acme.ValidatorOn}} == true</simple>
<to uri="validator:MyWebService.xsd"/>
</when>
</choice>
<to pattern="InOut" uri="xslt:/xslt/do-stuff-request.xsl?transformerFactory=transformerFactory&uriResolver=uriResolver"/>
<to ref="com.acme.ToLogging"/>
<transform>
<method bean="msgTransform" method="encrypt"/>
</transform>
<to uri="ref:doMoreStuffEndpoint"/>
<transform>
<method bean="msgTransform" method="decrypt"/>
</transform>
<to ref="com.acme.FromLogging"/>
<to uri="xslt:/xslt/do-stuff-request.xsl?transformerFactory=transformerFactory&uriResolver=uriResolver"/>
<process ref="com.acme.MetricsProcessor"/>
</policy>
</route>
1 ответ
Поздний ответ, но может быть полезным в будущем. Из документации:
Парсер ограничен поддержкой только одного оператора.
Чтобы включить его, левое значение должно быть заключено в ${ }
, Синтаксис:
${leftValue} OP rightValue
Вы должны использовать верблюд-простое выражение. Т.е. установить заголовок со значением вашего свойства, затем использовать ${headers.yourHeader}
внутри <when>
,
РЕДАКТИРОВАТЬ: Я нашел лучшее решение: используйте простой верблюд способ получить свойство: ${properties:com.acme.ValidatorOn}