2015-01-28 2 views
0

Учитывая простой маршрут, как этотЕсть ли способ сделать выходной файл потока: file? FileName = dynamic?

route.from("direct:foo") 
    .split() 
    .tokenize("\n") 
    .streaming() 
    .to("stream:file?fileName=target/streaming${header.count}.txt&closeOnDone=true"); 

который я тогда триггер с этим

@Test 
public void splitAndStreamToFile() { 
    StringBuilder builder = new StringBuilder(); 
    for(int i = 0; i < 500; i++) { 
     builder.append(i); 
     builder.append("\n"); 
    } 

    for(int i = 0; i < 10; i++) { 
     template.sendBodyAndHeader(builder.toString(), "count", i); 
    } 

} 

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

Другими словами, кажется, что fileName в конечной точке stream: file не является динамическим. Мне интересно, возможно ли это вообще? До сих пор мой google-фу не появился.

EDIT:

С ответом Клауса, я получил его на работу, как это:

route.from("direct:foo") 
        .split() 
        .tokenize("\n") 
        .streaming() 
        .recipientList(route.simple("stream:file?fileName=target/streaming${header.count}.txt&closeOnDone=true")); 

ответ

2

Св динамика которой есть шаблон EIP для:

Но это может быть хорошей идеей, чтобы поддержать файл/простой язык на варианте FileName как обычный файловый компонент. Не удалось зарегистрировать билет JIRA об этом улучшении.

+0

Спасибо. Я все еще новичок в Camel, поэтому я не знал, что могу заставить его работать таким образом. – Mopper

1

Исходник- из StreamProducer выглядит, как он не поддерживает ни один из языков экспрессии Camel еще:

private OutputStream resolveStreamFromFile() throws IOException { 
    String fileName = endpoint.getFileName(); 
    ObjectHelper.notEmpty(fileName, "fileName"); 
    LOG.debug("About to write to file: {}", fileName); 
    File f = new File(fileName); 
    // will create a new file if missing or append to existing 
    f.getParentFile().mkdirs(); 
    f.createNewFile(); 
    return new FileOutputStream(f, true); 
} 

См. sourecode.

Если вам нужны динамические имена файлов, вы должны взглянуть на file component, который поддерживает file language и заголовок CamelFileName.

0

Короче говоря,

в Duri=stream:file...

будет делать это.

«в D» в основном переводит «simple» или «file language», прежде чем он попадает в код компонента потока ... так что работает для "fileName=..."