Верблюд: Как идти все, когда в выборе, когда

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

person HongAnTC AnAn    schedule 07.01.2014    source источник
comment
Другой вариант — использовать Splitter и для каждого вызова Soapenv напрямую: a.   -  person Leo Prince    schedule 07.01.2014
comment
Привет, Лео, я использовал Splitter, и проблема в том, что мой входной файл разбит на несколько сообщений в зависимости от критериев, но мне нужен целый файл, чтобы я мог создать новый выходной файл.   -  person HongAnTC AnAn    schedule 08.01.2014


Ответы (3)


Насколько я понимаю, маршрутизатор на основе содержимого реализует семантику «если-иначе, если-иначе», что означает, что как только один тест оценивается как истинный, остальные тесты пропускаются. Если вы хотите создавать файлы для каждого случая, который возвращает 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()
person Ralf    schedule 07.01.2014
comment
Возможно, блокам .choice() тоже нужен .end()? - person vikingsteve; 07.01.2014
comment
@vikingsteve Не знаю. Я не очень хорошо знаком с Java DSL. Страница документации для маршрутизатора на основе содержимого не показывает его. Если бы вы могли подтвердить, что это необходимо, я бы, конечно, обновил ответ. - person Ralf; 07.01.2014
comment
Спасибо, Ральф и ВиккингСтив, проблема решена вашим ответом. - person HongAnTC AnAn; 08.01.2014

В DSL нет ничего плохого, и здесь вам не нужны конечные блоки. Я бы посмотрел на ваши данные и проследил, почему все вызовы заканчиваются в одном и том же блоке. Вставьте пару строк в лог или включите трассировщик и посмотрите, какие обмены проходят.

person Robert Simmons Jr.    schedule 07.01.2014

В 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;

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

person Ramu    schedule 16.11.2018