【问题标题】:is it possible to restart a job after stopping?停止后是否可以重新开始工作?
【发布时间】:2019-01-14 17:48:06
【问题描述】:

我正在开展一个项目,在该项目中,我每天最多可以访问 Google API 15k。所以我想在 15k 之后停止工作并在第二天恢复。请让我知道我该怎么做。

请让我知道我怎样才能达到同样的效果。现在我正在考虑使用石英调度程序来安排每天的工作。

如果有人需要完整的解释,我可以解释更多。

提前致谢。

【问题讨论】:

    标签: java spring-boot spring-batch


    【解决方案1】:

    您可以使用StepExecution#setTerminateOnly 停止步骤执行(及其周围的作业)。因此,在您的情况下,您可以使用例如 ItemReadListener#afterReadItemWriteListener#afterWrite 来访问步骤执行并在处理 15k 个项目后设置 terminateOnly 标志。当您像这样优雅地停止作业时,其状态将为STOPPED,您将能够在第二天再次重新启动它。

    您可以在参考文档的Stopping a Job Manually for Business Reasons 部分找到一个示例。

    希望这会有所帮助。

    【讨论】:

    • 谢谢,马哈茂德。您能否与石英分享一些与春季批次相关的文档。这样我就可以阅读更多关于调度的信息。
    【解决方案2】:

    我有类似的情况,我需要在服务器维护计划开始前 5 分钟停止 24/7 工作。

    我发现最简单的方法是使用 Reader 并返回 null 以指示作业应该停止。在您的情况下,处理 15k API 请求时返回 null 。

    这可能意味着您需要一个可供阅读器使用并由处理器更新的 bean(可能只是一个 AtomicInteger)。还有一个也知道 bean 的 Job Listener(对不起,我没有代码)。如果达到最大值,则在作业停止时将 Listener sets up a custom job exit value 返回给调度程序。调度程序必须具有足够的可配置性,以知道特定的退出值意味着第二天再次启动作业。 (任何其他非零值都被视为错误。)

    这意味着作业达到 15k 的可能性很小,但它也是最后一项,因此即使没有更多需要处理的内容,作业也会再次安排在第二天。不过没关系 - 作业将在第二天开始并立即以正常的完成状态停止,因此调度程序不会再次调度。

    【讨论】:

    • 谢谢,安德鲁。您能否与 spring 批处理共享石英调度程序的博客或文档参考。
    • 我对石英不熟悉。您需要研究石英功能,或者可能创建一个新问题并标记石英。
    猜你喜欢
    • 1970-01-01
    • 2020-02-21
    • 1970-01-01
    • 2019-01-05
    • 1970-01-01
    • 2012-12-13
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    相关资源
    最近更新 更多