我们开发了一些长期运行的C#控制台应用程序,这些应用程序将由Windows计划任务运行。每个网络的单个应用程序实例
这些应用程序可能在Intranet/Extranet上的许多不同服务器上运行。 我们无法确保它们在一台机器上运行,因为每个应用程序可能需要访问某些资源,这些资源仅在特定机器上可用。
尽管如此,所有这些应用程序都使用通用的WCF服务来访问数据库。
我们需要确保在任何时候只有一个应用程序正在运行。 由于应用程序可能位于不同的外联网计算机上,因此我们无法使用每台计算机互斥体或MSMQ。
我想过以下解决方案 - 带超时的WCF互斥服务。当一个应用程序运行时,它会检查它是否已启动(可能在另一台机器上),然后(在专用线程中)定期ping通WCF互斥服务以更新时间戳(如果ping失败,应用程序立即退出)。如果时间戳已过期,这意味着应用程序已崩溃,因此可以再次运行。
我想知道,如果这个“WCF互斥量”是我的问题的最佳解决方案。也许已经有一些第三方库实现了这种功能?
不,我不是说服务会等待一个“互斥体”才能发布。这更像是一个周期性的ping/keep-alive。控制台应用程序只是向WCF服务发出请求,WCF服务会更新数据库中的互斥时间戳,然后请求返回。同一应用程序的任何其他实例都会检查服务器上是否存在有效的“互斥体”,如果“互斥体”时间戳尚未过期,则退出。 – JustAMartin