2017-02-07 3 views
0

Коллеги, я пытаюсь настроить маршрут верблюда с помощью choice и doTry. Моя проблема Cannot resolve method 'when' на второй when статья. Вопрос: можно ли использовать doTry строительство в choice статья?Верблюд: doTry в разделе Choice

Маршрут выглядит следующим образом:

public void configure() { 
     from("sftp://.....").choice() 
      .when(header("CamelFileName").contains("XML P")).log("Validate ${file:name}").bean(new MessProcessor(), "logInputMessDetails") 
      .doTry(). 
        to("validator:file:C:\\Users...\\xsds\\p.xsd").log("${file:name} is valid") 
      .doCatch(ValidationException.class) 
       .log("XML P is not valid") 
       .to("file:sftp-inbound\\data-invalid\\" + header("CamelFileParent").toString()) 
       .bean(messProcessor, "stopCamel") 
/*The problem is here*/ .when(header("CamelFileName").contains("XML X")).log("Validate ${file:name}").bean(new MessProcessor(), "logInputMessDetails"). 
      doTry().to("validator:file:C:\\Users\....\xsds\\position.xsd").log("${file:name} is valid"). 
      doCatch(ValidationException.class).log("XML X is not valid").to("file:sftp-inbound\\data-invalid\\" + header("CamelFileParent").toString()). 
      bean(messProcessor, "stopCamel") 
      .end(); 

    } 

UPDATE

Маршрут после .bean(messProcessor, "stopCamel") удаления:

public void configure() { 
     from("sftp://.....").choice() 
      .when(header("CamelFileName").contains("XML P")).log("Validate ${file:name}").bean(new MessProcessor(), "logInputMessDetails") 
      .doTry(). 
        to("validator:file:C:\\Users...\\xsds\\p.xsd").log("${file:name} is valid") 
      .doCatch(ValidationException.class) 
       .log("XML P is not valid") 
       .to("file:sftp-inbound\\data-invalid\\" + header("CamelFileParent").toString()) 
       .end; 
/*The problem is still here*/ .when(header("CamelFileName").contains("XML X")).log("Validate ${file:name}").bean(new MessProcessor(), "logInputMessDetails"). 
      doTry().to("validator:file:C:\\Users\....\xsds\\position.xsd").log("${file:name} is valid"). 
      doCatch(ValidationException.class).log("XML X is not valid").to("file:sftp-inbound\\data-invalid\\" + header("CamelFileParent").toString()). 
      bean(messProcessor, "stopCamel") 
      .end(); 

    } 

UPDATE Еще один вариант

public void configure() { 

     from("sftp:...}") 

       .choice() 
       .when(header("CamelFileName").contains("XML_POS")).log("Validate ${file:name}") 
       .to("validator:file:C:\\pos.xsd").log("${file:name} valid") 
       .when(header("CamelFileName").contains("XML_SETS")).log("Validate ${file:name}") 
       .to("validator:file:C:\\sets.xsd").log("${file:name} valid").end() 
       .onException(Exception.class) 
       .process(new FailureResponseProcessor()) 
       .handled(true); 

      /*to("file:sftp-inbound");*/ 
    } 

ответ

1

Отделить обработки от маршрута ошибка,

onException (exception) 
    handled (true) 
    process failure processor 

А потом просто маршрут

from ftp 
to validate 
+0

Статья, большое спасибо. – May12

0

Дело в том, что, вероятно,

.bean(messProcessor, "stopCamel") 

не приводит к объекту, который поддерживает метод when().

Имейте в виду: это по-прежнему обычная Java. Вы можете вызвать эти методы только для объекта, который определяет соответствующий класс. И компилятор просто сообщает вам, что вызов bean() приводит к чему-то, что не знает when.

Таким образом, ответ заключается в том, чтобы отступить и посмотреть точный тип результата bean() и, возможно, сделать другой звонок.

+0

я удалил 'bean', но ничего не меняется. – May12

+0

Ответ: не слепо играть с этими звонками! Ответ заключается в том, чтобы отступить и ** узнать **, что эти методы означают и делают. Чтобы потом понять, как достичь желаемого результата! – GhostCat

+0

ChostCat, вы рекомендуете использовать '.multicast(). ParallelProcessing()' в моем случае? Мне нужно проверить xml, а затем, если каждый xml действителен, загрузите его в db. – May12