2

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

处理由几个逻辑阶段组成,假设为:

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

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

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

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

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

提前致谢。

更新

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

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

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

4

2 回答 2

1

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

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

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

于 2012-06-01T14:34:57.987 回答
0

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

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

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

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

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

ETC..

祝你好运。

于 2012-06-01T14:39:16.167 回答