【发布时间】:2014-02-13 21:41:30
【问题描述】:
我一直在通过制作一项作业将许多夜间安排的作业转换为一个接一个地运行。这在 Spring Batch 中是完全合法的,因为 Step 可以通过引用另一个作业来定义。
问题是 Quartz 会按计划运行一些相同的子作业,并且它们是不可重新启动的。这意味着有时“作业的作业”会失败,因为它试图启动一个已经在运行的作业。这产生了备受喜爱的:
JobRestartException: JobInstance already exists and is not restartable
我的问题是,这是否是一种告诉 Spring Batch 等待引用的作业可用然后运行它的方法。这是因为夜间工作流程需要 A->B->C。我知道我可以编写自己的自定义作业启动器来轮询 JobRepository 以完成有问题的子作业的 ExecutionStatus,但我希望 SB 已经想到了这个常见问题。
更新,为那些询问其工作原理的人提供的 Job of Jobs 示例。 ref 指向 SimpleJob bean 的作业。这很好用,但是当子作业已经在运行时会出现上述错误。
<!-- Example Job of Jobs -->
<job id="jobOfJobs">
<step id="step1">
<job ref="job1" />
</step>
<step id="step2">
<job ref="job2" />
</step>
</job>
【问题讨论】:
-
你能告诉我一些关于使 Step reference 成为 Job 的文档吗?我很好奇,我想这会导致状态和执行上下文的影响很多。至于你的问题,从介绍来看,“Spring Batch 不是调度框架”。 IMO 如果您试图使其成为一体,那么您就是在自找麻烦,尤其是当 Quartz 已经出现在图片中时。
-
@EmersonFarrugia 感谢您的提示。在我开始这项工作之前,我自己也读过这句话。但是,使用上述方法,我已经能够有效地将 SB 用作调度框架。
标签: spring quartz-scheduler spring-batch