有没有办法使 stream:file?fileName= 的输出文件动态化?

Is there a way to make the output file of a stream: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 行。

换句话说,stream:file 端点中的文件名似乎不是动态的。我想知道这是否可能?我的 google-fu 到目前为止什么也没找到。

编辑:

有了 Claus 的回答,我得到了这样的工作:

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

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, which supports the file languageCamelFileName header.

它是一个 动态到 的 EIP 模式:

但是像常规文件组件一样,在 fileName 选项上支持 file/simple 语言可能是个好主意。随意记录有关此改进的 JIRA 票证。

简而言之,

D uri=stream:file...

会的。

"toD" 基本上会在到达流组件代码之前翻译“simple”或“file language”...因此适用于 "fileName=..."