2013-04-26 106 views
1

我有一个包含表document的数据库。该表定义了我将处理的文档的路径。
文档的处理非常繁重,可能需要几分钟时间处理单个文档。
我有超过20万个文件需要处理。
文档托管在生产应用程序中。所以我必须每晚处理它们。
我的问题是:是否可以定义一个弹簧批处理作业,从数据库查询文档(未处理)并处理它们,然后安排该作业(使用Quartz)在上午8点停止并在晚上8点?在指定的时间间隔内运行弹簧作业

编辑
我想我应该让自己更清楚:
我的问题是关于:我应该有一个任务来处理所有的文件,并使其在一天结束的日常生活和重启停止。或者我应该让这份工作每次只处理一份文件?现在,我只用一个工作来遍历所有文档(因为我是Spring批处理文档),所有我发现的例子都在讨论读取整个表(使用读取器)和处理数据。
如果这是一种好方法,那么我该如何中断作业执行到一天结束时才能继续。
或者我应该只用一份文件?

+0

您是否有大概的时间来完成一个文件?如果是的话,我认为你可以达到你想要的效果 – 2013-04-26 11:31:25

+0

不,我不知道。我的问题是:我是否应该有一份工作来处理所有文件,并使其每天停止并在当天结束时重新开始。或者我应该让这份工作每次只处理一份文件? – 2013-04-26 13:04:59

回答

2

是的,这是可能的。

这个cron表达式会是这样的:

0 0/1 20-8 ? * MON-FRI 

就证实了这一点(它一直以来我看着cron的表情一会儿),但这应该运行的20:00时之间每分星期一至星期五08:00。 (默认为http://static.springsource.org/spring/docs/3.0.x/reference/scheduling.html),所以你不必担心重叠。然后,您可以在每次运行中选择一定数量的文件进行处理(每次运行10次),每上午8点钟,如果前一次运行完成,Quartz将启动另一次运行。当最后一次处理作业在早上结束时,直到下午5点才会再次开启。

注意注意最后的工作可能会在7:59:59开始并且运行时间超过上午8点,所以您可能希望提前一点结束时间来补偿。

编辑:

我觉得更细粒度的方法(不一定是单个文件,但也许块)更适合配料和调度。这是有效地使用石英来做循环,你会在一个工作中做,但给你所有的好处,不必担心调度元素!

+0

那么你认为我应该修改我的工作一次只处理一行(文档)吗? – 2013-04-26 13:02:25

+0

这就是我过去所做的事情 - 这使得安排这种方式变得更容易。我将编辑我的答案以回应您的修改。 – StuPointerException 2013-04-26 13:28:49

+0

好的,谢谢你的回答 – 2013-04-26 13:56:43

0

您将需要一份工作来一次处理来自数据库的一个文档。

与春季石英cron trigger可以安排其运行从晚上8点到7:30 AM(如果一个作业大约需要30分钟)的定期(每30分钟后说...)

你可以有工作做下面的事情。

从DB 过程文档中读取1(未处理)文档路径。 在数据库中删除(或标记为已处理) 提交

0

要使作业按计划启动,可以使用Quartz调度程序。但是,这不会在特定时间终止工作。要达到此目的,您应该使用

  1. 确保您的工作可以重新启动并尽可能使用最小的工作单位。
  2. 制作自定义作业包装,在作业启动时启动一个计时器并每隔1min轮询一次,以确定它是否必须关闭以及何时需要此操作,调用执行上下文并取消作业。
  3. 由于作业可以重新启动,它将能够从Quartz调度程序下次调用它时离开的位置重新启动。
相关问题