您将如何实施工作流程系统?

时间:2012-04-05 16:41:36

标签: algorithm oop workflow

我需要实施一个工作流程系统。

例如,要导出一些数据,我需要:

  1. 使用XSLT处理器转换XML文件
  2. 使用生成的转换转换为任意数据结构
  3. 使用生成的(文件或数据)并生成存档
  4. 将存档移动到指定的文件夹中。
  5. 我开始创建两种类型的Workflow,它负责添加新的Step对象并运行它。

    每个步骤实现一个StepInterface。

    我主要担心的是我的所有步骤都依赖于前一个步骤(第一个除外),我想知道处理这些问题的最佳方法是什么。

    我虽然循环每个步骤并为每个步骤提供前一个步骤(如果有的话),但我对此并不满意。

    另一个想法是允许将“上一步”设置为步骤,例如:

    $s = new Step();
    $s->setPreviousStep(Step $step);
    

    但是我失去了Workflow类的实用程序。

    任何想法,建议?

    顺便说一下,我也关注整个工作流程的成功或失败,这意味着如果任何步骤失败,我需要回滚或清理以前的数据。

3 个答案:

答案 0 :(得分:4)

我去年实现了类似的工作流引擎(虽然是封闭的源代码 - 所以没有我可以共享的代码)。以下是基于该经验的一些想法:

  1. StepInterface - 可以做你现在正在做的事情 - 抽象一步。
  2. 此外,提供回滚功能,但我认为步骤应该知道何时失败并清理,然后再继续。抽象步骤可以为您处理(模板方法)
  3. 你可能想要考虑基于StepResult的分支 - 所以你可以做一个带有stepResult对象和条件的StepMatcher - 仅当条件返回true时才执行它的子步骤。
  4. 如果步骤出错,您还可以执行StepException来处理异常流程。理想情况下,您可以在工作流级别定义(如果任何步骤失败,则执行此操作)和/或在步骤级别定义。
  5. 我采取的方法是,步骤返回一个明确定义的结构(StepResult),该结构可用于下一步。如果有庞大的数据(例如大文件等),那么资源的URI /定位器将在StepResult中传递。
  6. 您的工作流程需要使用上下文 - 在您引用的示例中,这将是文件的名称,存档的位置等等 - 所以想一下WorkflowContext
  7. 额外的想法

    您可能还需要考虑以下内容 - 如果这是您计划作为大型服务/服务器实施的内容:

    1. 步骤可以在动态加载的库中
    2. XML / JSON文件中的工作流定义 - 再次,在编辑时动态重新加载。
    3. 远程调用和回调 - 使用回调API将作业提交到远程服务。当远程服务回调时,将在流程的后续步骤中选择工作流程执行。
    4. 尽可能并行执行等。
    5. 无国籍设计

答案 1 :(得分:1)

回滚可以很容易地适应这个结构,因为每个Step将实现自己的rollback()方法,如果任何步骤失败,工作流可以调用(最好以相反的顺序)。< / p>

至于主要问题,这实际上取决于你想要多么复杂。在基本级别,您可以定义StepResult接口,该接口由每个步骤返回并传递给下一个接口。这种方法的明显问题是每个步骤都应该“知道”期望StepResult的实现。对于小型系统,这可能是可以接受的,对于较大的系统,您可能需要某种可配置的映射框架,可以告诉您如何将上一步的结果转换为下一步的输入。因此Workflow会调用StepStep会返回StepResultWorkflow然后调用StepResultConverter(这是您可配置的映射内容),{{1 }}返回StepResultConverterStepInput然后使用Workflow调用下一个Step,依此类推。

答案 2 :(得分:1)

我使用finite state machine实现工作流程取得了巨大成功。它可以是您想要的简单或复杂,多个工作流相互链接。通常,FSM可以实现为一个简单的表,其中通过在对象上保留转换的日志并简单地检索最后一个条目来跟踪给定对象的当前状态在历史表中。所以过渡的形式如下:

nextState = TransLookup(currState,Event,[Condition])

如果要实现前端,可以使用此转换信息构建当前状态下给定对象可用事件的列表。