我有一个可以并行运行的程序,即可以同时运行该进程的多个实例。我们假设它是一个名为.exe
的{{1}}文件。
此程序的每次运行都会在数据库中创建一个名为MyProgram.exe
的唯一ID。每次运行都有一个RunId
。状态可以是status
,"Running"
和"Run"
。程序开始运行时,状态设置为"运行"最终,状态将更新为"运行"如果一切顺利或"错误"当出现错误时。
这会一直有效,直到程序意外退出。例如,当服务器突然关闭时。在这种情况下,特定运行的状态将保持"Error"
,这是不正确的。这会导致程序混乱。
我最后一次对这个问题做了快速研究,有人推荐了一个明智的解决方案,遗憾的是,在我的案例中可能不起作用:
解决方案是在进程启动时使用此进程的id创建一个临时文件。当它结束时("运行","错误")删除此文件。这样,您可以查看文件是否仍然在下一次运行程序时运行,然后决定要执行的操作。
这个解决方案的问题是当我们看到临时文件并且程序仍在运行时!这意味着程序没有意外退出,但需要一段时间才能完成。所以我们不想终止它。
简而言之,当我们的计划意外存在时,我们如何以更好的方式通知自己?
答案 0 :(得分:2)
您可以使用心跳:每个"Running"
进程至少每隔x秒使用当前服务器时间戳更新其行的heartbeat
列。
因此,您有以下情况:
heartbeat >= current timestamp - x
:流程正在运行。heartbeat < current timestamp - x
:进程已崩溃。答案 1 :(得分:0)
我会这样做:
您添加第二个表,在其中记录RunID和DateTime。您可以从程序中每隔一秒/十秒/分钟(无论您希望的时间间隔)更新此表作为某种后台任务。 “更新”是指您要么更新现有记录,要么添加新记录,无论您认为最好。
第二个进程会定期检查此Log表以查找主表中当前状态为“正在运行”的所有RunId,以及特定RunId没有“新鲜”DateTime时(例如,您记录)每隔十秒,Log表中的最新值是20秒以上)你将“Running”状态更新为“Crashed”。