视窗服务设计
本文关键字:服务 | 更新日期: 2023-09-27 18:35:56
想象一下以下情况。Windows 服务不时检查数据库表中的数据。当出现一些新数据时,它将开始处理每个新行。
处理由几个逻辑阶段组成,让它成为:
- 从网络服务获取一些额外的数据;
- 通过 Web 服务通过阶段 1 中的数据查找 Existins 对象或创建新对象;
- 通知感兴趣的人已完成的操作(提供有关在第 2 阶段找到/创建的对象的详细信息);
- 做其他事情。
现在,如果发生任何异常,服务会更新数据库行并设置一个标志,指示发生了错误。一段时间后,服务将尝试再次处理该行...这就是问题所在。
处理将从最开始,从第 1 阶段开始。在这种情况下,如果在第 4 阶段发生异常,并且会一次又一次地发生,那么第 3 阶段的利害关系人将一次又一次地被告知......
在发生异常的情况下完全停止行处理是不可能的,在我的情况下也是不可取的。理想情况下,如果有一种方法可以从上次失败的阶段开始处理,那就太好了。
现在我需要你的建议如何处理所有这些。事实上,一切都更加复杂,因为有几种处理模式,不同数量的阶段等等。
提前谢谢。
更新
是的,我在数据行中有 State 参数:)它只是暂时不使用。异常处理对我来说并不是什么新鲜事。
问题是:处理状态切换的最佳方法是什么?换句话说,在阶段号和处理方法之间建立清晰的逻辑链接?执行流程可能非常不同,包括不同行的各种阶段和方法。
我希望,还有比为每个新内容编写无休止的开关/机箱块更令人愉快的方法吗?
几种模式可以帮助您解决描述中的每个问题。
- Windows 服务检查队列。 在您的服务中有一个每 1 分钟或 5 分钟或其他时间运行的计时器,检查队列,如果有任何新条目,请开始处理。(请参阅此处的示例:在 Windows 服务中使用的最佳计时器)
- 遵循一系列步骤通常称为工作流。 在工作流中,您具有当前状态,并在每个阶段中更新该状态。 因此,每一行都将从阶段 = 1 开始。 第一步之后,阶段 = 2,依此类推。 在例外情况下,它将在它离开的阶段,然后在该阶段重新开始该过程,或者无论您的逻辑是什么。 此状态将与每一行一起存储,调度代码将检查状态并将服务发送到当前阶段的正确起始代码。 即,根据状态考虑一组
If
语句。 - 处理异常非常简单。 每个工作单元都应该被包装在一个尝试中......捕获块。 出错时,记录异常,并根据业务规则标记行。
就实现而言,使用编程最佳实践来保持代码干净、模块化、整洁和有条理。 在开发解决方案时,请带回特定问题以获得更多帮助。
向数据库表添加一个字段,用于跟踪每一行的状态。 例如,您可以将此新字段称为 ProcessingState。
当行经历每个逻辑状态时,您可以更新此 ProcessingState 字段以标识行所处的状态。
服务中的每个逻辑步骤都应只处理处于适当状态的行。
下面是一个示例,假设您有五个逻辑步骤要完成。 您可以有以下状态;
- 等待状态 1。
- 状态 1 完成
- 等待状态 2
- 状态 2 完成
等。。
祝你好运。