2014-10-29 50 views
0

我正在使用石英创建Windows服务。我想在3个地方部署这个服务,它应该像一个服务停止运行,然后第二个服务应该启动,如果第二个服务失败,那么最后一个应该启动。所有的服务都指向单个数据库。我可以知道我该如何执行这些事情。处理多个窗口服务

@@更新问题

那么,所有的服务都在做同样的操作。我在我的数据库中有一列作为nextExecutionTime,如果超过当前时间,表示下一个服务将开始执行此作业。现在我面临的主要问题是,如果所有三个服务都会同时触发,那么它将从数据库获取数据并尝试同时更新。所以我需要减少并发性错误。我可以知道这个解决方案吗?我是否需要实施一些锁或类似的东西?

回答

0

这三个服务是否做同样的工作?请详细说明 !但是如果我将这些服务部署在不同的系统上,他们是如何意识到彼此的?我不知道你的具体要求,但我会做到这一点,如下所示: 假设:只有一个服务应该在一个时间做的工作休息的服务保持闲置。

我将在某个临时表中创建一些主列。我将启动任何一个服务,并将其名称(pcname或位置名称)作为主副本以及此临时表中的上次访问时间。

其他服务读取主人和最后访问时间。如果最后访问时间超过当前时间,那么我认为这项服务停止工作,所以我做了一些其他服务,这是在主人时间可用,并将他的详细信息插入临时表。

+0

问题已更新。 – 2014-11-14 07:43:43

+0

这与我已经应用的逻辑相同,我们有RowVersioning的逻辑,即使这样做不起作用,它会使用相同的数据在该表中插入多个条目,因为每个作业都插入它自己的数据。我想我在锁定特定行时出错了。 – 2014-11-14 12:14:05

0

我已经看到你的更新question.As我前面说我的答案在你的数据库中创建一些锁表,并创建锁持有人(服务名称/ pcname/locationname)和lastlockaccess时间戳(此服务lastaccesstime)列。手动插入详细信息对于任何一项服务并在执行以下任务的每项服务中添加额外代码:

1>每个窗口服务连接到db并读取锁表记录 2>假设有3个服务即A,B,C并且最初输入lockholder为A意味着服务A正在访问数据库。 3>当服务B和C检查锁定表时,如果服务A的lastlockaccess时间超过当前时间一些大的余量,则它们将知道A正在DB上工作,则这意味着服务A已停止。因此,为服务B编程插入新条目并且C持有锁的任何人都将开始执行。

希望这个解决方案可以帮助你,但它不是完美的解决方案。