我每天早上都在我的服务器上运行cron作业,它基本上连续运行三个不同的java程序(都有一个主方法),一个接一个让我把它们命名为 P1 , P2 和 P3 。
第一个流程 P1 ,最后一个流程 P3 非常快,但第二个流程 P2 在某个时候会耗费大量时间(有时候)它运行了一天以上),因为它做了一些复杂的业务逻辑。
业务计算非常复杂,并且基于当天流程中涉及的客户的周期性。
让我们说第1天我必须处理 100万客户,因为他们已注册第1天
并且第二天我的客户数量较少, 1000个客户。
现在,当第二个进程 P2 正在运行时,它将客户端处理详细信息存储在数据库中,状态为 PENDING ,因为它将更改为成功在最后一个过程 p3 完成。
现在我的问题是:
第1天
第2天
第1天启动的流程 P2 仍在运行,并在数据库中输入详细信息。
所有流程 P1 , P2 和 P3 在第2天开始 完成第二天的所有工作。
因此,当第2天的最后一个进程 P3 完成时,第1天的进程 P2 输入的数据库中所有先前的条目都将更新为SUCCESS ,即使第1天的最后一个过程 P3 尚未开始。
现在我不希望发生这种情况,即第2天流程 P3 更新第1天流程 P2 在数据库中输入的条目的状态。
我正在尝试确定如何解决此问题。
我认为有一件事会与数据库条目建立日期,但那么 P3 过程如何知道要更新哪些日期。
我知道这似乎很混乱。但如果我能澄清一点,请告诉我。
答案 0 :(得分:1)
简单的方法是让P1测试/创建一个标志文件,并在完成后删除标志文件。实际上,最好在运行P1 / P2 / P3的包装器脚本中执行此操作。
您需要处理的一个复杂因素是某些事情失败的可能性,留下一个标志文件......但没有运行P1 / P2 / P3。您可以用来处理这个问题的一个技巧是在标志文件中存储运行包装器脚本的shell(比如说)。然后使用kill 0 $THE_PID_FROM_THE_FILE
检查上一个脚本是否仍处于活动状态。 (如果进程存在,则kill
命令带有信号零测试。)