1

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

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

到目前为止,我只使用一项工作来迭代所有文档(因为我是 Spring Batch 文档)我发现的所有示例都在谈论读取整个表格(使用阅读器)和处理数据。
如果这是好方法,那么我怎么能中断作业执行以在一天结束时继续执行。
还是我应该只按文件使用一份工作?

4

3 回答 3

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

编辑:

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

于 2013-04-26T11:47:43.913 回答
0

您将希望有一份工作来一次处理来自数据库的一个文档。

使用Spring Quartz 中的cron 触发器,您可以将其安排为定期从晚上 8 点到早上 7:30 运行(如果一项工作需要大约 30 分钟)(比如每 30 分钟...)

你可以在下面做一些工作。

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

于 2013-04-26T13:19:07.943 回答
0

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

  1. 确保您的工作是可重新开始的,并且工作在尽可能小的工作单元上。
  2. 制作一个自定义 Job 包装器,它在您的作业开始时启动一个计时器并每 1 分钟轮询一次以确定它是否必须关闭,并且在需要时调用执行上下文并取消作业。
  3. 因为作业是可重新启动的,所以下次 Quartz 调度程序调用它时,它将能够从它停止的点重新启动。
于 2014-02-13T21:39:39.143 回答