0

我们开发了一些长期运行的 C# 控制台应用程序,这些应用程序将由 Windows 计划任务运行。

这些应用程序可能在 Intranet/Extranet 上的许多不同服务器机器上运行。我们无法确保它们在一台机器上运行,因为每个应用程序可能需要访问某些资源,这些资源仅在特定机器上可用。

尽管如此,所有这些应用程序都使用通用 WCF 服务来访问数据库。

我们需要确保在任何时候只有一个应用程序的实例在运行。由于应用程序可能位于不同的外联网计算机上,我们不能使用每台机器互斥锁或 MSMQ。

我考虑过以下解决方案 - 超时的 WCF Mutex 服务。当一个应用程序运行时,它会检查它是否已经启动(可能在另一台机器上),然后(在专用线程中)定期 ping WCF Mutex 服务以更新时间戳(如果 ping 失败,应用程序立即退出)。如果时间戳过期,这意味着应用程序已经崩溃,所以它可以再次运行。

我想知道,如果这个“WCF 互斥锁”是我的问题的最佳解决方案。也许已经有一些第三方库已经实现了这样的功能?

4

2 回答 2

1

您的互斥锁解决方案存在竞争条件。

如果不同服务器上的应用程序在时间戳过期后检查窗口中的时间戳,但在当前服务更新时间戳之前,您将运行两个实例。

我可能会走相反的路线。我会有一个中央监控服务。该服务将持续监控系统的运行状况。如果它检测到服务出现故障,它将在该机器或另一台机器上重新启动它。

您可能想硬着头皮去使用完整的企业服务总线。检查 ESB 的 Wikipedia 文章。它列出了十几个商业和开源系统。

于 2012-08-23T13:34:45.367 回答
0

网络位置上的文件锁定怎么样?

如果您可以使用独占读写创建/打开文件,那么它是唯一运行的应用程序。如果此正在运行的应用程序随后崩溃,则操作系统会自动释放锁定。

蒂姆

糟糕,刚刚重新阅读问题并看到“外联网”,请忽略我!

于 2012-08-23T13:45:12.510 回答