Верблюд: разделение коллекции и запись в файлы - PullRequest
11 голосов
/ 30 августа 2011

Я пытаюсь разделить ArrayList и записать каждый элемент в собственный файл, используя Apache Camel, как в этом упрощенном примере:

from("timer://poll?period=10000").process(new Processor(){
    public void process(Exchange exchange){
        ArrayList<String> list = new ArrayList<String>();
        list.add("one");
        list.add("two");
        list.add("three");
        exchange.getIn().setBody(list, ArrayList.class);
    }
}).split(body()).log(body().toString()).to("file:some/dir");

Журнал печатает каждый элемент, но только «три»сохранен в файл.Что я делаю не так?

Ян

Ответы [ 2 ]

8 голосов
/ 16 октября 2013

После того, как вы вызвали функцию split, ваш маршрут делится на 3 пути, каждый метод или маршрут, выполняемый после этого, применяются к каждому процессу.

В каждом способе обработки метод разделения добавляет CamelSplitIndex свойство.

Так что этот код должен работать

from("timer://poll?period=10000").process(new Processor(){
    public void process(Exchange exchange){
        ArrayList<String> list = new ArrayList<String>();
        list.add("one");
        list.add("two");
        list.add("three");
        exchange.getIn().setBody(list, ArrayList.class);
    }
}).split(body()).log(body().toString()).to("file:some/dir?fileName=${header.CamelSplitIndex}");

Это второй пример с xml-файлом и xpath.

Мы предполагаем, что вы хотите использовать xml для каждого узла order с именем элемента внутри:

<orders>
  <order>
    <name>Order 1</name>
  </order>
  <order>
    <name>Order 2</name>
  </order>
</order>

Мы предполагаем, что мы хотим разбить этот XML-файл на 2 файла

from("file://repo-source").split(xpath("//orders/order")).setHeader("orderName", xpath("/order/name").stringResult()).to("file://repo?fileName=${header.orderName}.xml");
7 голосов
/ 30 августа 2011

Производитель файла по умолчанию «переопределит», если файл уже существует.

См. Параметр fileExist на странице документации http://camel.apache.org/file2

Поскольку входные данные для этого маршрута такжефайл, тогда производитель будет «наследовать» имя файла от ввода.

Так что в вашем случае, если вы хотите сохранить каждое разделенное сообщение в новый файл, то вам нужно будет установить целевое имя файла,используя опцию fileName

"file:some/dir?fileName=splitted-${id}"

Опция fileName поддерживает простой и файловый язык

http://camel.apache.org/simple.html

http://camel.apache.org/file-language.html

Это означает, что файлимя может быть вычислено динамически, например, как указано выше, где $ {id} - это уникальный идентификатор сообщения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...