骆驼路线按文件过滤

时间:2020-05-12 12:20:24

标签: spring apache-camel

我知道这个问题被问了很多次,但是我正在尝试多种解决方案,但无法使其正常工作。

我对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();
    }
}

1 个答案:

答案 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