2017-02-13 7 views
0

Collegues, у меня есть маршрут, который проверяет xml по xsd. Я в этом случае маршрут вызова .to("jdbc:DataSource") каждый раз, когда какой-либо XML является действительным:Camel: Как однажды вставить данные в таблицу DB, если действительны только все xmls?

from("ftp://....." + 
      "&throwExceptionOnConnectFailed=true" + 
      "&filterDirectory=${date:now:yyyymmdd}") 
       .choice() 
        .when(header("CamelFileName").contains("XML_A.....")).log("Validate ${file:name}") 
        .to("validator:file:C:\\integration\\xsds\\xml_a.xsd").log("${file:name} is valid") 
        .when(header("CamelFileName").contains("XML_B.....")).log("Validate ${file:name}") 
        .to("validator:file:C:\\integration\\xsds\\xml_b.xsd").log("${file:name} is valid") 
       .when(header("CamelFileName").contains("XML_C.....")).log("Validate ${file:name}") 
        .to("validator:file:C:\\integration\\xsds\\xml_c.xsd").log("${file:name} is valid") 
       .end() 
       .log("Upload table ExtractS") 
       .to("bean:stgExtractToSQL") 
       .to("jdbc:dataSource") /*Here i would like to execute only one insert into one single table*/ 
      ; 

Как назвать .to("jdbc:dataSource") только один раз (только), когда все XML действительны? P.S. После .to("jdbc:dataSource") Мне нужно обработать каждый XML-файл. Спасибо.

+0

Как вы определяете 'когда все xml valid'? Если на FTP-сервере всего 3 файла, вы можете отличить этот случай от случая с 5 файлами? – SubOptimal

+0

Рассмотрите тот факт, что каждый файл будет порождать отдельный поток. Вам нужно будет каким-то образом сохранить состояние, а затем только вызвать базу данных, когда предикат будет выполнен. Возможно, вам стоит взглянуть на проверку требований EIP http://camel.apache.org/claim-check.html – noMad17

+0

Collegues, есть ли способ выполнить вставку один раз до начала маршрута? Мне кажется, это подходит и мне. – May12

ответ

1

Если есть ошибка проверки, компонент валидатора Camel выдаст исключения, поэтому вы не должны попасть в .to("jdbc:dataSource") и должны быть в безопасности. Тем не менее, лучший способ справиться с этим - использовать и doCatch() на вашем маршруте, чтобы указать, что он знает об исключении, и в случае, если вам нужно добавить дополнительные действия, когда проверка не выполняется. Таким образом, ваш маршрут будет выглядеть примерно так:

from("ftp://....." + 
     "&throwExceptionOnConnectFailed=true" + 
     "&filterDirectory=${date:now:yyyymmdd}") 
      .log("Validate ${file:name}") 
      .doTry() 
       .choice() 
       .when(header("CamelFileName").contains("XML_A.....")) 
        .to("validator:file:C:\\integration\\xsds\\xml_a.xsd") 
       .when(header("CamelFileName").contains("XML_B.....")) 
        .to("validator:file:C:\\integration\\xsds\\xml_b.xsd") 
       .when(header("CamelFileName").contains("XML_C.....")) 
        .to("validator:file:C:\\integration\\xsds\\xml_c.xsd") 
      .endChoice() 

      .log("${file:name} is valid") 
      .log("Upload table ExtractS") 
      .to("bean:stgExtractToSQL") 
      .to("jdbc:dataSource") /*Here i would like to execute only one insert into one single table*/ 
      .endDoTry() 
      .doCatch(ValidationException.class) 
      .log("Validation of file [${file:name}] failed") 
      .end() 
     ; 
+0

Халед, я думаю, что этот маршрут будет называть '.to (" bean: stgExtractToSQL ")' каждый раз, когда текущий xml будет действительным, но мне нужно вызвать '.to (" bean: stgExtractToSQL ")' только один раз, когда все xml действительны. – May12

+0

Значит, вы проходите несколько XML-файлов? Если да, то откуда вы знаете, что все они прошли через валидатор? Является ли это количество файлов за одну единицу времени? – Khaled