Верблюд: как перейти все "когда" в "выбор когда"

Мне нужно задать вопрос об операторе "выбор когда" на маршруте 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;

Вышеупомянутое решение проверит все три условия, даже если первый проход.

Другие вопросы по тегам