我如何定义一个 JSR 352 块步骤以每 10 秒检查一次(并通常使用内置检查点)?

How can I define a JSR 352 chunk step to checkpoint every 10 seconds (and use built-in checkpointing in general)?

有没有使用<chunk time-limit="10"...>的简单方法?

我可以将 时间限制 与我的自定义 CheckpointAlgorithm 结合使用吗?

简答:

可能最简单的方法是

<chunk time-limit="10" item-count="999999">

其中 999,999 只是一个永远不会被击中的大数字。

背景

为了解释原因,下面是对“如何使用 JSR 352 内置检查点?”的更笼统的回答。

在 JSR 352 中有两种配置检查点的方法,即两种检查点策略。

在 JSL 中 (XML)

这是默认的“内置”行为。

在Java

由应用程序的 CheckpointAlgorithm 实现控制,并通过 JSL 中的 checkpoint-policy="custom" 启用。

内置策略基于项目或时间,以先“命中”者为准

了解内置检查点策略的基本点是它基于项目计数或时间限制,以先到者为准。

例子

  1. <chunk>

    10 项后(默认)

  2. <chunk item-count="25">

    25 项后

  3. <chunk time-limit="10">

    10 秒后或 10 个项目(同样,项目计数默认值),以先到者为准。

  4. <chunk time-limit="10" item-count="25">

    25 项后或 10 秒,以先到者为准。

  5. <chunk time-limit="10" item-count="999999">

    在 999,999 项或 10 秒之后,以先到者为准(所以在除最简单的处理之外的所有处理中,这实际上意味着在 10 秒之后,如有必要,您可以使这个数字更大)。

  6. <chunk checkpoint-policy="custom">

    通过 CheckpointAlgorithm 在您自己的应用程序代码中实现,使用方法 isReadyToCheckpoint(),以及可选的超时),并引用喜欢:

     <chunk checkpoint-policy="custom">
         <checkpoint-algorithm ref="myCustomCheckpointAlgorithm">
    

讨论

因此 time-limit 默认为“0”,定义为“无限时间”或“不准时检查点”。另一方面,item-count 默认为“10”,而 item-count 为“0”的类似行为是未定义的。

因此,基于某些秒数的检查点的最佳方法只是将项目计数设置得足够高,这无关紧要,这在实际应用程序中通常并不难。

这是上面的示例 #5。


您不能将内置控件与您的“自定义”算法结合使用!

  1. <chunk checkpoint-policy="custom" time-limit="5"> 忽略时间限制!

您不能将自定义算法与任何“项目”检查点策略属性结合使用(这些属性将被忽略)。您不能说检查点基于我的自定义算法或 5 秒,以先到者为准。

  1. <chunk checkpoint-policy="custom" item-count="500"> 项目数被忽略!

与前面的示例相同。

警告

周围有一些旧的、过时的例子,例如this article 还包含“提交间隔”和“时间”检查点策略。这些 并入最终的 1.0 规范。

结束语

上面的解决方案不太优雅,“黑客”质量。

也许规范应该定义一种行为,其中 item-count="0" 表示“从不根据项目计数设置检查点”,这将允许更简单的解决方案。也许这应该被考虑用于可能的 1.1 更新。