在定义的时间间隔内运行Spring作业

时间:2013-04-26 11:20:48

标签: java quartz-scheduler spring-batch

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

修改
我想我应该让自己更清楚:
 我的问题是:我是否应该有一份工作来处理所有文件并使其每天停止并在一天结束时重新启动。或者我应该每次只处理一个文件?

到现在为止,我只使用一个工作来遍历所有文档(因为我是Spring Batch文档)我发现的所有示例都在讨论读取整个表(带读取器)和处理数据。 如果这是一个好方法,那么如何在一天结束时中断作业执行 或者我应该按文档使用一份工作?

3 个答案:

答案 0 :(得分:2)

是的,这是可能的。

这个的cron表达式类似于:

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

请确认一下(自从我查看cron表达式以来已经有一段时间了)但这应该在周一至周五的20:00到08:00之间每分钟运行一次。

默认情况下,Quartz作业不会在Spring中同时运行(参见:http://static.springsource.org/spring/docs/3.0.x/reference/scheduling.html),因此您不必担心重叠。然后,您可以在每次运行中选择一定数量的文档进行处理(10个说),每分钟一直到早上8点。如果前一个运行结束,Quartz将触发另一个运行。当最后一个处理工作在早上完成时,它将不会再次发射,直到下午5点。

注意,最后一份工作可能会在7:59:59开始并超过8am标记,因此您可能希望稍早提前结束时间来补偿。

修改

我认为更精细的方法(不一定是单个文档,但可能是块)更适合批处理和调度。这实际上是使用quartz来完成你在单个作业中所做的循环,但是给你带来的好处是不必担心调度元素!

答案 1 :(得分:0)

您希望有一份工作一次处理来自DB的一个文档。

使用Spring Quartz中的cron trigger,您可以将其安排在8 PM到7:30 AM(如果一项工作大约需要30分钟),定期(比如说每30分钟......)

你可以在事情之下做好工作。

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

答案 2 :(得分:0)

要按计划开始工作,您可以使用Quartz调度程序。但是,这不会在特定时间终止作业。要实现这一目标,你应该

  1. 确保您的工作可以重新启动并处理尽可能小的工作单元。
  2. 创建一个自定义作业包装器,在作业启动时启动计时器并每1分钟轮询一次以确定它是否必须关闭,并在需要时调用执行上下文并取消作业。
  3. 由于作业可以重新启动,因此可以从下次Quartz调度程序调用它时停止的位置重新启动。