如何确定服务的一个实例已关闭并启动新实例

时间:2010-10-29 13:24:32

标签: .net design-patterns

喂 我有以下情况:一个WinService,它从队列中处理一些东西,写入其他表(在处理过程中),在它完成后删除该条目并移动到下一个。

我需要一种机制来确定实例是否处于活动状态以及是否启动或唤醒第二个实例。

到目前为止,我认为有两个实例正在进行,每个实例都尝试从队列中获取内容并处理它(尝试 - 如果它可以 - 就像没有设置keepAliveFlag或记录的lastUpdateDate一样很久以前)。可能存在处理相同记录的情况 - 这是不利的。

对于上面提出的解决方案,当实例尝试编写keepAliveFlag并且没有成功停止时,我还需要一种机制。

除了这个解决方案之外,还有实例的解决方案是不断地将内容写入db,第二个实例检查是否写入了新内容,如果没有唤醒或启动第二个实例。但是可能会出现几个问题:如果前大师醒来会发生什么?一般而言,第二种情况似乎难以正确实施。

现在的问题是:实现这个的正确模式是什么?

2 个答案:

答案 0 :(得分:1)

服务是Windows系统中的单例。支持多个实例的唯一方法是安装多个具有不同服务名称的相同二进制文件。

您可以使用[ServiceController][1]类监控任何指定服务的状态,使用Status property来确定当前状态并采取相应措施。

答案 1 :(得分:0)

我的团队目前做的是:

  • 在每台计算机上,安装一个监视器实例(本身就是一个Windows服务)。
  • 此监视器(从中央数据库)读取它应监视的local services列表。
  • 它还会读取它正在监控的每个本地服务的工作/非工作时间。
  • 然后它监视每个服务是否有常规心跳(以及其他状态消息)。
  • 如果本地服务在其工作时间内未启动,则显示器将启动它。
  • 如果本地服务正在运行但没有心跳,则监视器会重新启动它。
  • 监视器在数据库中记录每个服务的状态,并根据需要发送信息/警告/警报消息。