代码之家  ›  专栏  ›  技术社区  ›  Aviad P.

工作流设计困境-状态机,是或否

  •  13
  • Aviad P.  · 技术社区  · 16 年前

    1. 备用
    2. 修复中

    问题是,我是否为所有不同的状态创建状态机工作流?或者我要创建用于在状态之间转换的工作流?

    如果可以,请帮助我:-)

    谢谢

    更新:

    悬赏获胜者:莫里斯 -感谢所有其他人真正帮助我更多地了解工作流、MS工作流基础和其他更轻量级的替代品。不幸的是,只有一个赏金获胜者,莫里斯的回答和评论对我帮助最大。

    9 回复  |  直到 16 年前
        1
  •  9
  •   Maurice    16 年前

    工作流是发生的某种业务流程。这意味着这个过程的开始和结束。您的描述听起来更像是在跟踪库存中的物品。

    最后一个工作流很可能是一个状态工作流,因为该项目经历了以下各个阶段:

    • 断断续续
    • 在商店里修理
    • 修复
        2
  •  22
  •   Răzvan Flavius Panda    11 年前

    状态机是一种非常强大的实现技术,尽管我建议您考虑一个叫做 StateLess by Nicholas Blumhardt (Autofaq creator) ,因为它是一个非常简单的状态机实现,避免了Windows工作流不必要的复杂性。他的方法避免了运行时引擎持有长时间运行的工作流的问题,因为状态是由一个简单的变量(如字符串或int)定义的。

    下面是一个示例状态机:

    var phoneCall = new StateMachine<State, Trigger>(State.OffHook);
    
    phoneCall.Configure(State.OffHook)
        .Permit(Trigger.CallDialed, State.Ringing);
    
    phoneCall.Configure(State.Ringing)
        .Permit(Trigger.HungUp, State.OffHook)
        .Permit(Trigger.CallConnected, State.Connected);
    
    phoneCall.Configure(State.Connected)
        .OnEntry(() => StartCallTimer())
        .OnExit(() => StopCallTimer())
        .Permit(Trigger.LeftMessage, State.OffHook)
        .Permit(Trigger.HungUp, State.OffHook)
        .Permit(Trigger.PlacedOnHold, State.OnHold);
    
    // ...
    
    phoneCall.Fire(Trigger.CallDialled);
    Assert.AreEqual(State.Ringing, phoneCall.State);
    

    var stateMachine = new StateMachine<State, Trigger>(
        () => myState.Value,
        s => myState.Value = s);
    

    与运行Windows Workflow所需的多个项目相比,您可以在一个程序集中实现这一点。维护是非常低的,他们没有“设计师”为您的应用程序生成代码,等等。同样,这很简单,这就是美的所在。

        3
  •  2
  •   Dave O.    16 年前

    考虑到您的添加(超过3个状态,不允许所有转换),我将执行以下操作:

    1. 在项目本身中存储每个项目的状态。

    然后,您所需要做的就是使用状态机转换您的项,每当发生外部事件时,强制/暗示这一点。

        4
  •  2
  •   rdmueller    16 年前

    对我来说,状态机方面似乎更重要。因此,将您的软件实现为状态机。

    是的,您应该使数据库中的所有项持久化。这也是保持长时间运行的工作流运行的方式——它们一直存在于数据库中,直到被任何活动重新激活。所有现成的业务流程管理系统(BPMS)都是这样做的。这些工作流不会保存在内存中。

    将所有内容都保存在数据库中,可以轻松创建报告。

    正如其他人已经提到的,用状态信息创建一个新列,或者甚至用元数据创建一个新表:state,可能是状态改变时的日志,谁改变了状态,关于即将举行的活动的信息(零件已订购但未交付-如果交付丢失,应在多少天后与供应商进行检查?)。这将使您有机会根据需要添加元数据,而不会影响零件数据库。

        5
  •  1
  •   TToni    16 年前

    正如在原始帖子的评论中所讨论的,我对使用WF解决这个特殊问题有一些问题。

        6
  •  0
  •   Dmitri Nesteruk    16 年前

    尽管状态机模式在技术上是正确的选项,但也有一个选项可以创建一个带有一个巨大循环的顺序工作流。在某些情况下,它实际上效果更好,更容易理解。

        7
  •  0
  •   raoulsson    16 年前

    你有三种不同的状态,就我所见,所有的转换都是允许的。考虑到这一点,我不会为状态机而烦恼,因为状态机是一段检查允许的转换并向前推进的代码。

    当状态驱动业务时,或者当需要一段受信任的代码作为负责“有效转换”的唯一参与者时,状态机是有意义的。

    更简单地说,您只需要在任何时间点具有给定状态的实体。。。

        8
  •  0
  •   Scott McClenning    16 年前

    听起来是个有趣的项目,祝你好运。

        9
  •  0
  •   user2795877    9 年前

    我想我们需要了解两件事。

    状态机-将重点表示实体所处的特定状态。

    在您的情况下,由于您的整个流程围绕单个实体进行,并且其在任何给定时间点的当前状态都是singleton,因此我建议使用状态机。

    建议:

    示例程序: https://www.javacodegeeks.com/2012/06/apache-commons-scxml-finite-state.html

    https://events.linuxfoundation.org/sites/events/files/slides/ApacheConUS2014%20-%20Apache%20Commons%20SCXML%202.0.pdf

    推荐文章