【问题标题】:Windows service designWindows 服务设计
【发布时间】:2012-06-01 14:28:35
【问题描述】:

想象以下情况。 Windows 服务会不时检查数据库表中的数据。当一些新数据出现时,它开始处理每一行。

处理由几个逻辑阶段组成,顺其自然:

  • 从网络服务获取一些额外的数据;
  • 通过 Web 服务通过阶段 1 的数据找到一个存在的对象或创建一个新对象;
  • 将已完成的操作告知感兴趣的人(包括在第 2 阶段找到/创建的对象的详细信息);
  • 做别的事。

现在,如果发生任何异常,该服务会更新 DB 行并设置一个标志,指示发生了错误。一段时间后,服务将尝试再次处理该行......这就是问题所在。

处理将从一开始,从阶段 1 开始。在这种情况下,如果在阶段 4 发生异常并且它会一次又一次地发生,则将一次又一次地通知来自阶段 3 的感兴趣的人......

在出现异常的情况下完全停止行处理是不可能的,在我的情况下也不可取。理想情况下,如果有一种方法可以从上次失败的阶段开始处理,那就太好了。

现在我需要您的建议,如何处理所有这些问题。事实上,一切都更加复杂,因为有几种处理模式,不同的阶段数等等。

提前致谢。

更新

是的,我在数据行中有 State 参数 :) 它只是暂时不使用。而且异常处理对我来说并不是什么新鲜事。

问题是:处理状态切换的最佳方式是什么?换句话说,要在阶段编号和处理方法之间建立清晰的逻辑联系?执行流程可能非常不同,包括针对不同行的不同数量的阶段和方法。

我希望,有比为每个新情况编写无尽的 switch/case 块更令人愉快的方法吗?

【问题讨论】:

  • 供参考:如果您拥有服务的主要原因是“不时”运行一些东西,那么您需要的可能不是 Windows 服务,而是计划任务。跨度>

标签: c# .net design-patterns windows-services


【解决方案1】:

有几种模式可以帮助您解决描述中的每个问题。

  1. Windows 服务检查队列。在您的服务中设置一个计时器,每 1 分钟或 5 分钟或其他时间运行一次,检查队列,如果有任何新条目,则开始处理。 (参见此处的示例:Best Timer for using in a Windows service)
  2. 遵循一系列步骤通常称为工作流程。在工作流中,您有一个当前状态,您可以在每个阶段更新该状态。因此,每一行都将从阶段 = 1 开始。在第一步之后,阶段 = 2 等等。在例外情况下,它将在它离开的阶段,然后将在该阶段重新开始该过程,或者您的任何其他逻辑是。此状态将与每一行一起存储,调度代码将检查状态并将服务发送到当前阶段的正确起始代码。即,根据状态考虑一组 If 语句。
  3. 处理异常非常简单。每个工作单元都应该包装在一个 try...catch 块中。出错时,记录异常,并根据您的业务规则标记该行。

就实现而言,使用编程最佳实践来保持您的代码干净、模块化、整洁和有条理。在开发解决方案时,请提出具体问题以获得更多帮助。

【讨论】:

  • 是的,所有这些都是显而易见的。我担心的是管理工作流程和所有阶段切换。正如我已经说过的,处理并不是对所有情况都是典型的,最终编写大量的 switch 块并不是一件令人愉快的事情。我想知道,有没有更灵活、更智能的方式将执行阶段与具体方法联系起来?
  • 技术上我认为这就是Windows Workflow Foundation 的用途,但我从未使用过它。
  • 如果您的工作流程比您问题中的示例复杂得多,您应该考虑Windows Workflow Foundation
  • Eren Ersönmez,我从未与 WWF 合作过,但我今天读到了它。我不清楚的事情:现在,通过使用继承等,我可以使用覆盖来扩展基类中的现有方法或改变它们的行为。在工作流程中是否有可能发生这样的事情,或者我每次只需要稍作改动时都会创建一个完整的工作流程?
【解决方案2】:

在您的数据库表中添加一个字段来跟踪每一行的状态。例如,您可以将此新字段称为 ProcessingState。

当行经过每个逻辑状态时,您可以更新此 ProcessingState 字段以确定行处于哪个状态。

服务中的每个逻辑步骤都应该只处理处于适当状态的行。

这是一个示例,假设您需要完成五个合乎逻辑的步骤。你可以有以下状态;

  1. 等待状态 1。
  2. 状态 1 完成
  3. 等待状态 2
  4. 状态 2 完成

等等。

祝你好运。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-19
    • 1970-01-01
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多