![](/img/trans.png)
[英]Spring cloud stream Kafka consumer stuck with long running job and large value for max.poll.interval.ms
[英]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计划程序。 但是,这不会在特定时间终止作业。 为此,您应该
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.