2013-12-18 5 views
2

Я даться файл, содержащий числовые идентификаторы, которые разделяются символами новой строки («\n»):Apache Camel Splitter файла в примере

123948 
939904 
129384 
234049 

и т.д. Я хочу использовать верблюд, чтобы преобразовать файл в экземпляр следующего POJO:

public class IDFile { 
    private String fileName; // The name of the file 
    private List<Long> ids;  // All the IDs in the file (123948, 939904, etc.) 

    // Constructor, getters/setters, etc. 
} 

Я пытаюсь увидеть, если я могу использовать Splitter компонент CAMEL, чтобы сделать эту форму мне, но он чувствует, как я пытаюсь заставить круглую затычку в квадратное отверстие:

<route> 
    <from uri="file://input/idfile"/> 
    <split streaming="true"> 
     <tokenize token="\n" /> 
     <to uri="bean://idfileProcessor?method=process"/> 
    </split> 
</route> 

Вышеприведенное выглядит так, будто оно разбило бы мой файл на List<Long>, но мне также нужно имя файла, связанное с этим списком. Есть идеи? Заранее спасибо!

+1

делает idfileProcessor карты для IDFile где-то. потому что он выглядит как его процессор. Если бы вы могли показать нам, как вы обрабатываете обмен? – Ashish

+0

Спасибо @Ashish (+1) - Думаю, я думал, что '' * выполняет преобразование для меня *, так что к моменту поступления сообщения в 'idfileProcessor' (да, Camel' Processor') Я могу просто извлечь «IDFile» POJO из обмена следующим образом: 'IDFile idFile = (IDFile) exchange.getIn(). GetBody();'. Затем 'idfileProcessor' мог * обрабатывать * экземпляр' IDFile'. Извините за беспорядок! – IAmYourFaja

ответ

3

На бирже есть заголовок «CamelFileName». Вашему процессору/компоненту передается ссылка на обмен, и вы можете получить заголовок оттуда и связать его с маркером, с которым вы были связаны.

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

<camel:route id="splitter_test"> 
    <camel:from uri="file:///home/steppra1/camel_test?delete=true&amp;idempotent=true" /> 
    <camel:to uri="bean:splitBean?method=init" /> 
    <camel:split streaming="true"> 
     <camel:tokenize token="\n" /> 
     <camel:to uri="bean:splitBean?method=addToken" /> 
    </camel:split> 
    <camel:to uri="bean:splitBean?method=done" /> 
    <camel:log message="${in.body}" loggingLevel="INFO" logName="split_test" /> 
</camel:route> 

боба вы используете для поддержания состояния на объекте обмена:

public class SplitBean { 
    public Object init(Exchange exchange) { 
     exchange.setProperty("splitTokens", new ArrayList<Integer>()); 
     return exchange.getIn().getBody(); 
    } 

    public Object addToken(Exchange exchange) { 
     ((List<Integer>)exchange.getProperty("splitTokens")).add(Integer.parseInt((String)exchange.getIn().getBody())); 
     return null; 
    } 

    public Tuple done(Exchange exchange) { 
     return new Tuple<String, List<Integer>>((String)exchange.getIn().getHeader("CamelFileName"), (List<Integer>)exchange.getProperty("splitTokens")); 
    } 
} 

файл, содержащий строки

1 
2 
3 
5 

, отправленный на маршрут под именами splitter.text и splitter_2.txt, выдается следующий выход из системы говоря:

2013-12-18 18:20:02,081 INFO split_test - Tuple [first=splitter.txt, second=[1, 2, 3, 5]] 
2013-12-18 18:20:46,610 INFO split_test - Tuple [first=splitter_2.txt, second=[1, 2, 3, 5]] 

НТН

+0

Спасибо @ Ralf (+1) - внутри моего 'idfileProcessor' (который является просто классом Java, реализующим« Процессор Camel »и, следовательно, содержит метод« public void process (Exchange) »), можете ли вы представить пример кода для того, как Я мог бы получить свой экземпляр «IDFile», то есть мне понадобится поле «String fileName» (каким-то образом полученное из заголовка CamelFileName, которое вы упомянули), а также «Список ids»? Еще раз спасибо! – IAmYourFaja

+0

Я обновил ответ с помощью примера, используя компонент, а не процессор. Извините, я недостаточно внимательно прочитал ваш комментарий. В вашем процессоре вы можете получить доступ к имени файла, как в методе 'done (Exchange)'. У меня также есть ощущение, что для этого не требуется никакой Java-компонент, и вы могли бы сделать это с одним из поддерживаемых языков скриптов прямо в Spring DSL. Может быть, кто-то другой мог бы служить примером для этого? – Ralf

 Смежные вопросы

  • Нет связанных вопросов^_^