Java & Apache-Camel:从 direct-endpoint 到 file-endpoint
Java & Apache-Camel: From direct-endpoint to file-endpoint
我试图建立一个路径来将文件从一个目录复制到另一个目录。但不是使用:
from(file://source-directory).to(file://destination-directory)
我想做这样的事情:
from(direct:start)
.to(direct:doStuff)
.to(direct:readDirectory)
.to(file://destination-folder)
我做了以下事情:
路线
@Component
public class Route extends AbstractRouteBuilder {
@Override
public void configure() throws Exception {
from("direct:start")
.bean(lookup(ReadDirectory.class))
.split(body())
.setHeader("FILENAME", method(lookup(CreateFilename.class)))
.to("file:///path/to/my/output/directory/?fileName=${header.FILENAME}");
}
处理器
@Component
public class ReadDirectory implements CamelProcessorBean {
@Handler
public ImmutableList<File> apply(@Header("SOURCE_DIR") final String sourceDir) {
final File directory = new File(sourceDir);
final File[] files = directory.listFiles();
if (files == null) {
return ImmutableList.copyOf(Lists.<File>newArrayList());
}
return ImmutableList.copyOf(files);
}
}
我可以使用以下pseudo-Test开始我的路线(重点是我可以通过producer.sendBodyAndHeader(..)
手动开始我的路线)
public class RouteIT extends StandardIT {
@Produce
private ProducerTemplate producer;
@Test
public void testRoute() throws Exception {
final String uri = "direct:start";
producer.sendBodyAndHeaders(uri, InOut, null, header());
}
private Map<String, Object> header() {
final Map<String, Object> header = Maps.newHashMap();
header.put("SOURCE_DIR", "/path/to/my/input/directory/");
return header;
}
}
AbstractRouteBuilder
延长 SpringRouteBuilder
CamelProcessorBean
只是一个Marker-Interface
StandardIT
加载 SpringContext 和东西
问题是,我必须设置文件名。我读过一些骆驼设置 header CamelFileNameProduced
的东西(在文件端点期间)。它是一个带有时间戳的通用字符串,如果我不设置文件名 - 写入的文件将使用这个通用字符串作为文件名。
我的问题是:有没有更漂亮的复制文件的解决方案(但是从direct-endpoint开始,读取路径中间的目录)和保留目的地的文件名? (我在使用from("file:source").to("file:destination")
时不需要设置文件名,为什么现在必须设置?)
您可以在使用生产者模板发送时设置文件名,只要在路由之间的路由期间传播 header 就没问题,Camel 默认情况下会这样做。
例如
@Test
public void testRoute() throws Exception {
final String uri = "direct:start";
Map headers = ...
headers.put(Exchange.FILE_NAME, "myfile.txt");
producer.sendBodyAndHeaders(uri, InOut, null, headers);
}
文件组件多说说如何控制文件名
我试图建立一个路径来将文件从一个目录复制到另一个目录。但不是使用:
from(file://source-directory).to(file://destination-directory)
我想做这样的事情:
from(direct:start)
.to(direct:doStuff)
.to(direct:readDirectory)
.to(file://destination-folder)
我做了以下事情:
路线
@Component
public class Route extends AbstractRouteBuilder {
@Override
public void configure() throws Exception {
from("direct:start")
.bean(lookup(ReadDirectory.class))
.split(body())
.setHeader("FILENAME", method(lookup(CreateFilename.class)))
.to("file:///path/to/my/output/directory/?fileName=${header.FILENAME}");
}
处理器
@Component
public class ReadDirectory implements CamelProcessorBean {
@Handler
public ImmutableList<File> apply(@Header("SOURCE_DIR") final String sourceDir) {
final File directory = new File(sourceDir);
final File[] files = directory.listFiles();
if (files == null) {
return ImmutableList.copyOf(Lists.<File>newArrayList());
}
return ImmutableList.copyOf(files);
}
}
我可以使用以下pseudo-Test开始我的路线(重点是我可以通过producer.sendBodyAndHeader(..)
手动开始我的路线)
public class RouteIT extends StandardIT {
@Produce
private ProducerTemplate producer;
@Test
public void testRoute() throws Exception {
final String uri = "direct:start";
producer.sendBodyAndHeaders(uri, InOut, null, header());
}
private Map<String, Object> header() {
final Map<String, Object> header = Maps.newHashMap();
header.put("SOURCE_DIR", "/path/to/my/input/directory/");
return header;
}
}
AbstractRouteBuilder
延长SpringRouteBuilder
CamelProcessorBean
只是一个Marker-InterfaceStandardIT
加载 SpringContext 和东西
问题是,我必须设置文件名。我读过一些骆驼设置 header CamelFileNameProduced
的东西(在文件端点期间)。它是一个带有时间戳的通用字符串,如果我不设置文件名 - 写入的文件将使用这个通用字符串作为文件名。
我的问题是:有没有更漂亮的复制文件的解决方案(但是从direct-endpoint开始,读取路径中间的目录)和保留目的地的文件名? (我在使用from("file:source").to("file:destination")
时不需要设置文件名,为什么现在必须设置?)
您可以在使用生产者模板发送时设置文件名,只要在路由之间的路由期间传播 header 就没问题,Camel 默认情况下会这样做。
例如
@Test
public void testRoute() throws Exception {
final String uri = "direct:start";
Map headers = ...
headers.put(Exchange.FILE_NAME, "myfile.txt");
producer.sendBodyAndHeaders(uri, InOut, null, headers);
}
文件组件多说说如何控制文件名