【问题标题】:Problem with Multiple Instances of Windows Services多个 Windows 服务实例的问题
【发布时间】:2012-08-13 11:08:27
【问题描述】:

我有多个 Windows 服务实例,每个实例都在不同的服务器上运行。当它在表中找到一条记录时,就会启动每个 Windows 服务。 现在预期的功能是 如果其中一个 Windows 服务选择了记录,那么其他 Windows 服务不应该选择相同的记录。 实际功能: 每个 Windows 服务都应该选择不同的记录。

所有实例都在同时拾取相同的记录和处理,这是一个问题。

任何人都可以提出解决上述问题的方法吗?

其他细节: 我已经添加了代码,我们正在检查数据集是否包含记录(我们之前插入的用于处理 Windows 服务的记录),然后我们执行一些业务,并发送邮件。问题是由于有多个 Windows 服务实例,我收到了多封不可取的邮件。

DataSet reportsDs  = new DataSet();            
int ReportID = 0;
int MastReptID = 0;
try
{
    reportsDs = stored procedure to get the dataset in which the record is inserted
    if (reportsDs != null && reportsDs.Tables[0].Rows.Count > 0)
    {
        ServiceName.isProcCompleted = false;
        for (int rptcnt = 0; rptcnt < reportsDs.Tables[0].Rows.Count; rptcnt++)
        {
           //some business functions
           //send a mail after finishing the above business process
         }
    }
}

【问题讨论】:

  • 你能贴出“挑选记录”的代码吗?您的问题听起来像是同步问题,但没有代码我们只能猜测。
  • 你在说什么类型的记录..?这是文件记录还是数据库表中的记录..?您是否有您正在使用的服务的代码示例..?您需要提供有关您的流程的更多详细信息
  • 是数据库表记录。
  • 您采用了什么机制来阻止多个节点获取相同的记录?您是否有事务性的“获取并删除”或“获取并标记为正在使用”?
  • 我已经放置了一个从新开始的“状态”列,一旦记录正在处理状态更改为“进行中”,但问题是在状态更改为“进行中”之前,另一个Windows 服务实例正在获取记录。

标签: c# web-services windows-services


【解决方案1】:

在数据库中使用唯一标识符列。 让每个服务在启动时生成它自己的 guid。

使用以下SQL的修改获取一行,假设主键是id,guid列是LOCKGUID

Select TOP 1 id FROM mytable where LOCKGUID is null ORDER BY id;

现在使用以下 SQL 更新行,传入参数 @MYGUID 和 @ID

Update mytable set LOCKGUID=@MYGUID where LOCKGUID is null and id=@id 

现在获取记录

Select id,field1,field2... from mytable where LOCKGUID=@MYGUID and id=@ID

如果您收到零个结果,您需要从第 1 步再次循环,因为另一个服务首先声明了此记录。

您可以编写一个存储过程来为您完成所有这些处理,从而无需多次往返服务器。

【讨论】:

  • 我还有一个问题,如果服务已经声明了记录并在处理过程中停止了怎么办?我们可以处理已经声明但未完全处理的记录吗?
猜你喜欢
  • 2011-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-19
  • 2021-10-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多