在完成特定路线后安排骆驼路线

时间:2018-02-19 10:13:02

标签: apache-camel quartz-scheduler

我们将一个大文件读入数据库(实际上,我们将Excel读取到csv然后将csv转储到数据库中),在完成此操作后,我需要将几个SELECT语句的结果转储到文件中。

然后通过邮件分发这些文件。

如何在将整个文件转储到数据库表中后,将Camel安排为仅以SELECT开头?

1 个答案:

答案 0 :(得分:0)

可能有几种方法可以实现这一目标。如果带有SELECT语句的路由选择了加载数据的路由,那么Camel将默认执行此操作。

在下面的玩具示例中,第一个路径在一个输出目录中设置一个标志文件(代替将文件读入数据库),然后转到两个端点。从这些端点启动两个路由,将文件复制到两个不同的输出目录。

.multicast()行可以省略,在必要时我不清楚。

public class DivergentRouteBuilder extends RouteBuilder {

@Override
public void configure() throws Exception {
    final String FLAG_URI = "file:data/output?doneFileName=${file:name}.flag";
    final String OUTPUT = "file:data/output";
    final String OUTPUT2 = "file:data/output2";

    final String REPORT1 = "direct:one";
    final String REPORT2 = "direct:two";

    final Route2IsScheduled isScheduled = new Route2IsScheduled();

    from("file:data/input")
    .to("log:?level=INFO&showBody=true&showHeaders=true")
     .to(FLAG_URI)
     .multicast()
     .to(REPORT1, REPORT2);

    from(REPORT1)
        .to(OUTPUT);

    from(REPORT2)
        .choice()
            .when(isScheduled)
                .to(OUTPUT2)
            .otherwise()
                .stop()
            .end();
    }
}

但是,当将文件读入数据库并输出SELECT语句的结果时,会有不同的日程安排,这段代码变得很丑陋。假设每天更新一个数据仓库,但每月只需要一些报告,然后相应的路径必须检查它是否已安排。这种情况发生在示例中 isSchduled

我有类似的要求,所以最后我选择单独通过Quartz安排我的路线。存储数据的路由比读取数据的路由提前1小时进行调度。后者必须检查数据是否是最新的。