我有一个 Spring 批处理作业,每天运行 4 次。作业启动后,它会检查上一个作业的状态。如果先前的作业状态为“已启动”,则该作业被中止。我有一个查询要检查。问题是,如果一个作业检查前一个作业状态失败,它的状态将是“失败”,下一个作业将开始处理,这样两个实例将并行运行。所以我们必须手动停止一个。这迫使我们持续监控工作。因此,我还尝试通过更改查询来检查之前的 5 个作业运行。那也行。但是有没有其他方法可以使用 JVM 或其他一些我们可以满足这个标准的技术?
请建议..!
我有一个 Spring 批处理作业,每天运行 4 次。作业启动后,它会检查上一个作业的状态。如果先前的作业状态为“已启动”,则该作业被中止。我有一个查询要检查。问题是,如果一个作业检查前一个作业状态失败,它的状态将是“失败”,下一个作业将开始处理,这样两个实例将并行运行。所以我们必须手动停止一个。这迫使我们持续监控工作。因此,我还尝试通过更改查询来检查之前的 5 个作业运行。那也行。但是有没有其他方法可以使用 JVM 或其他一些我们可以满足这个标准的技术?
请建议..!
如果没有 2 个作业可以同时运行,那可能是因为存在您要保护的资源。锁定机制最适合于此。阅读Java Concurrency In Practice以获得更多信息。如果您无法快速访问这本出色的书籍,可以从http://docs.oracle.com/javase/tutorial/essential/concurrency/开始
只是一个想法,但是使用时间戳作为状态是否有意义?
另一种可能性是让你的
如果一个作业未能检查先前的作业状态,则其状态将为“失败”
检查更稳健。让它可能失败的差距在哪里?可能您想使用一些锁定机制(文件锁、数据库锁、互斥锁)。