0

我有一个 Spring 批处理作业,每天运行 4 次。作业启动后,它会检查上一个作业的状态。如果先前的作业状态为“已启动”,则该作业被中止。我有一个查询要检查。问题是,如果一个作业检查前一个作业状态失败,它的状态将是“失败”,下一个作业将开始处理,这样两个实例将并行运行。所以我们必须手动停止一个。这迫使我们持续监控工作。因此,我还尝试通过更改查询来检查之前的 5 个作业运行。那也行。但是有没有其他方法可以使用 JVM 或其他一些我们可以满足这个标准的技术?

请建议..!

4

3 回答 3

0

一种选择是使用FileLock进行控制,以防止您的应用程序/jvm 的多个实例同时运行。

使用一些文件来表示“作业”的状态。作业开始后尝试获取此文件的锁定。将作业状态写入此文件并在完成后释放锁定。如果作业未能获取文件锁定 - 正在运行另一个作业 - 执行与您的情况相关的任何操作(例如,静默失败,或终止之前的作业)。

这是在 UNIX 世界中解决此类问题的常用方法。

更新: 是一个简单的例子,展示了如何使用 FileLock。

于 2013-06-18T08:30:26.593 回答
0

如果没有 2 个作业可以同时运行,那可能是因为存在您要保护的资源。锁定机制最适合于此。阅读Java Concurrency In Practice以获得更多信息。如果您无法快速访问这本出色的书籍,可以从http://docs.oracle.com/javase/tutorial/essential/concurrency/开始

于 2013-06-18T08:22:32.200 回答
0

只是一个想法,但是使用时间戳作为状态是否有意义?

另一种可能性是让你的

如果一个作业未能检查先前的作业状态,则其状态将为“失败”

检查更稳健。让它可能失败的差距在哪里?可能您想使用一些锁定机制(文件锁、数据库锁、互斥锁)。

于 2013-06-18T08:18:50.547 回答