Мне нужно задать вопрос об операторе "выбор, когда" в маршруте Apache Camel. В следующем примере, если у меня есть два элемента soap-env:Order, которые имеют значение 1, 2, я хочу создать два файла xml с именами output_1.xml и output_2.xml. Однако код может создать только один файл output_1.xml. Может ли кто-нибудь дать мне какие-либо идеи или подсказки? Спасибо за любую помощь.
public void configure() {
...
from("direct:a")
.choice()
.when(ns.xpath("//soap-env:Envelope//soap-env:Order='1'"))
.to("file://data?fileName=output_1.xml")
.when(ns.xpath("//soap-env:Envelope//soap-env:Order='2'"))
.to("file://data?fileName=output_2.xml")
.when(ns.xpath("//soap-env:Envelope//soap-env:Order='3'"))
.to("file://data?fileName=output_3.xml")
}
Ответ 1 · рейтинг 6 · Ralf
Насколько я понимаю, маршрутизатор на основе содержимого реализует семантику "если-иначе, если-иначе", что означает, что как только один тест оценивается как истинный, остальные тесты пропускаются. Если вы хотите создавать файлы для каждого случая, который возвращает true, вам нужно изменить маршрут на что-то вроде этого:
from("direct:a")
.choice()
.when(ns.xpath("//soap-env:Envelope//soap-env:Order='1'"))
.to("file://data?fileName=output_1.xml")
.end()
.choice()
.when(ns.xpath("//soap-env:Envelope//soap-env:Order='2'"))
.to("file://data?fileName=output_2.xml")
.end()
.choice()
.when(ns.xpath("//soap-env:Envelope//soap-env:Order='3'"))
.to("file://data?fileName=output_3.xml")
.end()
Ответ 2 · Robert Simmons Jr.
В DSL нет ничего плохого, и здесь вам не нужны конечные блоки. Я бы посмотрел на ваши данные и проследил, почему все вызовы заканчиваются в одном и том же блоке. Вставьте пару строк в лог или включите трассировщик и посмотрите, какие обмены проходят.
Ответ 3 · рейтинг -1 · Ramu
В Camel root selection(), если у вас есть несколько случаев when(), вы должны написать else(). См. ниже.
from("direct:a")
.choice()
.when(header("foo").isEqualTo("bar"))
.to("direct:b")
.when(header("foo").isEqualTo("cheese"))
.to("direct:c")
.otherwise()
.to("direct:d")
.end;
Вышеупомянутое решение проверит все три условия, даже если сначала пройдет одно.