我知道这个问题被问了很多次,但是我正在尝试多种解决方案,但无法使其正常工作。
我对Apache Camel真的很陌生,并且正在Spring Boot中使用它。
我想做的是拥有到我的一个文件夹的全局路由,并且当文件到达此文件夹时,将根据文件名的一部分触发一个过程。
当前,我只是设置一条路由,并尝试仅针对我的一个文件触发该过程:
@Override
public void configure() throws Exception {
from("file://{{data.input.dir}}?moveFailed=errors&delete=true").choice()
.when(header("CamelFileName").endsWith(".zip"))
.process(myprocessor)
.end();
}
我的测试:
@EndpointInject("mock:result") protected MockEndpoint resultEndpoint;
@Test
public void test() throws Exception {
ModelCamelContext mcc = camelContext.adapt(ModelCamelContext.class);
// Build a test route by adding an mock endpoint to the route
RouteDefinition route = mcc.getRouteDefinition(ROUTE_NAME);
RouteDefinition testRoute = route.to(resultEndpoint);
但是在最后一行,我这里有一个null pointer exeception
。
编辑:这是我的路线定义
@Component public class MyRoute extends RouteBuilder {
public static final String ROUTE_NAME = "myRoute";
private final Processor myProcessor;
@Autowired public MyRoute(@Qualifier("my.processor") Processor myProcessor) {
this.myProcessor= myProcessor;
}
@Override public void configure() throws Exception {
from("file://{{data.input.dir}}?moveFailed=errors&delete=true").routeId(ROUTE_NAME).choice()
.when(header("CamelFileName").startsWith("ACK")).process(myProcessor).end();
}
}
答案 0 :(得分:1)
首先:您为了在测试中获得路由定义而通过的ROUTE_NAME
是什么?由于您尚未在路线中定义路线ID,因此Camel会自动生成路线ID。您真的用常量定义了生成的路由名称吗?添加其他路线时,此名称可以更改。
您应该设置一个静态的自定义路由ID
from("whatever").routeId("import-file-route").choice()...
这样您就可以获得带有可靠参考的Route定义
mcc.getRouteDefinition("import-file-route")
第二:据我所知,您不能仅在路由定义上调用.to
。如果要向路由添加模拟端点,则必须advice the route。
例如,可以通过将此方法添加到测试类中来完成此操作...
public void addMockToEndOfRoute() throws Exception {
context.getRouteDefinition(""import-file-route"").adviceWith(context, new AdviceWithRouteBuilder() {
@Override
public void configure() {
weaveAddLast().to("mock:result");
}
});
}
...,然后在测试方法中调用addMockToEndOfRoute()
。
已添加到答案
当前,您导入所有文件,并尝试将路由限制为具有特定名称的文件。问题是所有导入的文件都被删除。因此,当您以后尝试读取相应的DATA文件时,该文件可能已被删除。
您可以使用带有正则表达式的include
选项将file-consumer限制为具有特定名称模式的文件
from("file://{{data.input.dir}}?include=ACK.*&...")
就像这样,仅导入名称为“ ACK [whatever]”的文件,因此您可以删除content based router。