繁体   English   中英

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

[英]Running Spring job for a defined interval of time

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

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

到现在为止,我只使用一项工作来遍历所有文档(自从我使用Spring Batch文档以来),就发现了所有示例,他们都在谈论(使用阅读器)读取整个表并处理数据。
如果这是个好方法,那么我该如何中断工作执行,直到一天结束。
或者我应该只按文档使用一项工作?

是的,这是可能的。

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开始并超过上午8点,因此您可能希望将结束时间提前一些以进行补偿。

编辑:

我认为更细粒度的方法(不一定是单个文档,而可能是一个块)更适合于批处理和调度。 这有效地利用了石英来完成您将要在单个工作中执行的循环,但是却为您带来了不必担心调度元素的所有好处!

您将需要一项工作来一次处理DB中的一个文档。

在Spring Quartz中使用cron触发器 ,您可以将其计划为定期运行(例如每30分钟之后),从晚上8点运行到7:30 AM(如果一项作业大约需要30分钟)。

您可以做下面的事情。

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

要使作业按计划开始,可以使用Quartz计划程序。 但是,这不会在特定时间终止作业。 为此,您应该

  1. 确保您的作业可重新启动并且以最小的工作单位进行工作。
  2. 创建一个自定义的Job包装器,该包装器在您的作业开始时启动一个计时器,并每隔1分钟轮询一次,以确定是否必须关闭计时器,何时需要关闭计时器,调用执行上下文并取消作业。
  3. 因为该作业是可重新启动的,所以它将能够从下一次Quartz调度程序调用它的中断点重新启动。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM