После проверки в сплиттере не найден процессор.

У меня есть маршрут Camel, которому нужно получить файл XML с FTP в виде потока, проверить его и разделить.

Все работает нормально вплоть до проверки, но затем разделение не работает должным образом. При отладке я обнаружил, что разделенный процесс не находит никакого процессора, когда исходное сообщение является потоком. Мне это очень похоже на баг.

     from("direct:start")
    .pollEnrich("ftp://user@host:21?fileName=file.xml&streamDownload=true&password=xxxx&fastExistsCheck=true&soTimeout=300000&disconnect=true")
    .to("validator:myXsd.xsd")
    .split().tokenizeXML("myTag")
    .to(to)
    .end();

В этом случае я вижу, как Exchange попадает в сплиттер, но процессор не найден, и сплит ничего не делает. поведение отличается, если я удалю проверку:

     from("direct:start")
    .pollEnrich("ftp://user@host:21?fileName=file.xml&streamDownload=true&password=xxxx&fastExistsCheck=true&soTimeout=300000&disconnect=true")
    .split().tokenizeXML("myTag")
    .to(to)
    .end();

В этом случае сплиттер работает нормально.

Кроме того, если файл XML не приходит из потока, то все в порядке.

   from("file:file.xml")
    .to("validator:myXsd.xsd")
    .split().tokenizeXML("myTag")
    .to(to)
    .end();

Я обновляю свою версию Camel до 2.15.2, но все равно получаю ту же ошибку.


person pmartin8    schedule 05.08.2015    source источник
comment
Возможно, это поможет: camel.apache.org/why-is- мое-сообщение-body-empty.html   -  person Claus Ibsen    schedule 06.08.2015
comment
Да, это ответ на мой вопрос. Вы можете опубликовать это как ответ, я приму его. Спасибо.   -  person pmartin8    schedule 10.08.2015


Ответы (2)


Я не знаю, как работает валидатор, но если меняется тело сообщения, попробуйте сохранить его как заголовок или свойство, например: .setHeader("headerName",simple("${body}")) и после валидатора .setBody(simple("${header.headerName}"))

person dey    schedule 06.08.2015
comment
Я попробовал ваше решение, но у меня та же проблема. После отладки в Camel выяснилось, что может быть ошибка. Я обновлю свой вопрос соответственно. - person pmartin8; 07.08.2015
comment
Так что решение в комментарии Клауса. Если вы работаете с потоком, они не читаются повторно, поэтому вы должны использовать .streamCaching() (после from) или вы можете .convertBodyTo(String.class) после получения потока - person dey; 09.08.2015

Проблема в том, что я пытался передать тело, которое было потоком. (streamDownload=true). Валидатор прочитает поток и проверит содержимое. Без проблем.

Но проблема возникает, когда приходит разделение, поток уже прочитан и закрыт. Таким образом, сплит ничего не может сделать с потоком.

Я уже работал над проблемой без потока, но я думаю, что работа с потоковым кэшированием также сработает, если поток необходим.

См. http://camel.apache.org/why-is-my-message-body-empty.html

person pmartin8    schedule 01.09.2015