视窗服务设计

本文关键字:服务 | 更新日期: 2023-09-27 18:35:56

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

处理由几个逻辑阶段组成,让它成为:

  • 从网络服务获取一些额外的数据;
  • 通过 Web 服务通过阶段 1 中的数据查找 Existins 对象或创建新对象;
  • 通知感兴趣的人已完成的操作(提供有关在第 2 阶段找到/创建的对象的详细信息);
  • 做其他事情。

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

处理将从最开始,从第 1 阶段开始。在这种情况下,如果在第 4 阶段发生异常,并且会一次又一次地发生,那么第 3 阶段的利害关系人将一次又一次地被告知......

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

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

提前谢谢。

更新

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

问题是:处理状态切换的最佳方法是什么?换句话说,在阶段号和处理方法之间建立清晰的逻辑链接?执行流程可能非常不同,包括不同行的各种阶段和方法。

我希望,还有比为每个新内容编写无休止的开关/机箱块更令人愉快的方法吗?

视窗服务设计

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

  1. Windows 服务检查队列。 在您的服务中有一个每 1 分钟或 5 分钟或其他时间运行的计时器,检查队列,如果有任何新条目,请开始处理。(请参阅此处的示例:在 Windows 服务中使用的最佳计时器)
  2. 遵循一系列步骤通常称为工作流。 在工作流中,您具有当前状态,并在每个阶段中更新该状态。 因此,每一行都将从阶段 = 1 开始。 第一步之后,阶段 = 2,依此类推。 在例外情况下,它将在它离开的阶段,然后在该阶段重新开始该过程,或者无论您的逻辑是什么。 此状态将与每一行一起存储,调度代码将检查状态并将服务发送到当前阶段的正确起始代码。 即,根据状态考虑一组If语句。
  3. 处理异常非常简单。 每个工作单元都应该被包装在一个尝试中......捕获块。 出错时,记录异常,并根据业务规则标记行。

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

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

当行经历每个逻辑状态时,您可以更新此 ProcessingState 字段以标识行所处的状态。

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

下面是一个示例,假设您有五个逻辑步骤要完成。 您可以有以下状态;

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

等。。

祝你好运。