Верблюд: как перейти все "когда" в "выбор когда"
Мне нужно задать вопрос об операторе "выбор когда" на маршруте 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")
}
3 ответа
Насколько я понимаю, маршрутизатор на основе содержимого реализует семантику "если - еще, если - еще", то есть, как только один тест оценивается как true, остальные тесты пропускаются. Если вы хотите создать файлы для каждого случая, который возвращает 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()
В DSL нет ничего плохого, и здесь вам не нужны конечные блоки. Я бы посмотрел ваши данные и проследил, почему все вызовы заканчиваются в одном и том же блоке. Вставьте пару строк журнала или включите трассировщик и посмотрите, какие обмены проходят.
В Camel root choice(), если у вас есть несколько случаев when(), вы должны написать иначе (). Пожалуйста, обратитесь ниже.
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;
Вышеупомянутое решение проверит все три условия, даже если первый проход.