我们将一个大文件读入数据库(实际上,我们将Excel读取到csv然后将csv转储到数据库中),在完成此操作后,我需要将几个SELECT语句的结果转储到文件中。
然后通过邮件分发这些文件。
如何在将整个文件转储到数据库表中后,将Camel安排为仅以SELECT开头?
答案 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小时进行调度。后者必须检查数据是否是最新的。