【发布时间】:2019-01-14 17:48:06
【问题描述】:
我正在开展一个项目,在该项目中,我每天最多可以访问 Google API 15k。所以我想在 15k 之后停止工作并在第二天恢复。请让我知道我该怎么做。
请让我知道我怎样才能达到同样的效果。现在我正在考虑使用石英调度程序来安排每天的工作。
如果有人需要完整的解释,我可以解释更多。
提前致谢。
【问题讨论】:
标签: java spring-boot spring-batch
我正在开展一个项目,在该项目中,我每天最多可以访问 Google API 15k。所以我想在 15k 之后停止工作并在第二天恢复。请让我知道我该怎么做。
请让我知道我怎样才能达到同样的效果。现在我正在考虑使用石英调度程序来安排每天的工作。
如果有人需要完整的解释,我可以解释更多。
提前致谢。
【问题讨论】:
标签: java spring-boot spring-batch
您可以使用StepExecution#setTerminateOnly 停止步骤执行(及其周围的作业)。因此,在您的情况下,您可以使用例如 ItemReadListener#afterRead 或 ItemWriteListener#afterWrite 来访问步骤执行并在处理 15k 个项目后设置 terminateOnly 标志。当您像这样优雅地停止作业时,其状态将为STOPPED,您将能够在第二天再次重新启动它。
您可以在参考文档的Stopping a Job Manually for Business Reasons 部分找到一个示例。
希望这会有所帮助。
【讨论】:
我有类似的情况,我需要在服务器维护计划开始前 5 分钟停止 24/7 工作。
我发现最简单的方法是使用 Reader 并返回 null 以指示作业应该停止。在您的情况下,处理 15k API 请求时返回 null 。
这可能意味着您需要一个可供阅读器使用并由处理器更新的 bean(可能只是一个 AtomicInteger)。还有一个也知道 bean 的 Job Listener(对不起,我没有代码)。如果达到最大值,则在作业停止时将 Listener sets up a custom job exit value 返回给调度程序。调度程序必须具有足够的可配置性,以知道特定的退出值意味着第二天再次启动作业。 (任何其他非零值都被视为错误。)
这意味着作业达到 15k 的可能性很小,但它也是最后一项,因此即使没有更多需要处理的内容,作业也会再次安排在第二天。不过没关系 - 作业将在第二天开始并立即以正常的完成状态停止,因此调度程序不会再次调度。
【讨论】: