您推荐哪种工作流程引擎?

时间:2009-05-23 20:09:24

标签: workflow

我正在考虑在即将到来的项目中使用工作流引擎。我们知道使用工作流引擎有很多警告,我们在许多平台上都有很多开发经验,因此我们愿意让工作流引擎的选择优先于我们最喜欢的工具集或开发人员IDE。

我们对外部工作流程(即将SOAP调用聚合成事务感知,更高级别的SOA)更感兴趣的是内部工作流程(即用于易于更改的ERP目的的petri网,而不涉及额外的编码器时间)。你会推荐哪种工作流引擎?我们已经通过OracleMicrosoft以及一些open source内容深入查看了这些内容。这一切都非常令人难以置信,所以只有在您拥有实施内部工作流程的真实生活经验时才能回复。

2 个答案:

答案 0 :(得分:8)

如果您可以使用状态机,那么我建议使用名为StateLess by Nicholas Blumhardt (Autofaq creator)的开源项目。他的方法避免了运行时引擎持有的长时间运行工作流的问题,因为状态是由一个简单的变量(如字符串或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所需的多个项目相比,您只需在一个程序集中实现此功能。维护非常少,没有“设计师”可以为您生成代码等。再次,它很简单,并且存在美感。

答案 1 :(得分:5)

我过去曾部署过K2和WF系统。 K2相当强大,但很有吸引力。 WF是一个弱者,但很快就会改善。两者都很好地集成了.NET堆栈(特别是MOSS),并且都具有非常好的工具集成。一旦理解了工作流模型,两者都相对容易开发。

您可以从许多不同的MS合作伙伴那里获得解决方案支持,虽然我的猜测是WF更容易获得解决方案支持(即更多的合作伙伴有更多的顾问知道WF而不是K2)。

不幸的是,我对Oracle产品或您提到的开源替代品没有任何经验,因此我无法评论这些。

如果您不知所措,我建议您查看WF Virtual Labs(页面底部)。它们将让您掌握技术,使语言失效,经历几个场景。一旦掌握了这一点,了解WF如何适应您想要做的事情应该会更加容易。另外,我可以推荐Essential Windows Workflow - 非常好的书。这是WF 4.0 from PDC的一个很好的介绍。