有没有办法使 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);
}
如果您需要动态文件名,您应该查看 file component, which supports the file language 和 CamelFileName
header.
它是一个 动态到 的 EIP 模式:
但是像常规文件组件一样,在 fileName 选项上支持 file/simple 语言可能是个好主意。随意记录有关此改进的 JIRA 票证。
简而言之,
至D uri=stream:file...
会的。
"toD" 基本上会在到达流组件代码之前翻译“simple
”或“file language
”...因此适用于 "fileName=..."
给定这样一条简单的路线
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);
}
如果您需要动态文件名,您应该查看 file component, which supports the file language 和 CamelFileName
header.
它是一个 动态到 的 EIP 模式:
但是像常规文件组件一样,在 fileName 选项上支持 file/simple 语言可能是个好主意。随意记录有关此改进的 JIRA 票证。
简而言之,
至D uri=stream:file...
会的。
"toD" 基本上会在到达流组件代码之前翻译“simple
”或“file language
”...因此适用于 "fileName=..."