Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Which Workflow Engine do you recommend? [closed]

Tags:

workflow

I am kicking around the idea of using a workflow engine on this upcoming project. We know that there is a lot of caveats with using a workflow engine and we have a lot of development experience in many platforms so we would be willing to let the choice of workflow engine take precedence over our favorite toolset or developer IDE.

We are more interested in internal workflow (i.e. petri net for easily changeable ERP purposes without involving additional coder time) than external workflow (i.e. aggregating SOAP calls into a transaction aware, higher level SOA). Which workflow engine would you recommend? We have superficially looked at offerings by Oracle, Microsoft, and some open source stuff too. It's all very overwhelming so please respond only if you have real life experience with implementing internal workflow.

like image 458
Glenn Avatar asked May 23 '09 20:05

Glenn


2 Answers

If you can use a state machine, then I'd recommend an open source project called StateLess by Nicholas Blumhardt (Autofaq creator). His approach avoids the issue of long running workflows being held by a runtime engine, as the state is defined by a simple variable such as a string or int.

Here is a sample state machine:

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);

Your state can be an integer which will allow you to feed it the current state from a database. This can be set on the constructor of the state machine as follows:

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

You can implement this in just one assembly, compared to the multiple projects you need to run Windows Workflow. Maintenance is extremely low, there is no "designer" that generates code for your, etc. Again, it is simple, and there lies the beauty.

like image 58
David Robbins Avatar answered Oct 26 '22 12:10

David Robbins


I've deployed both K2 and WF systems in the past. K2 is quite strong, but spendy. WF is an underdog, but improving quickly. Both integrate with the .NET stack (MOSS specifically) quite well and both have very good tool integration. Both are relatively easy to develop for once you understand the workflow model.

You can get solutions support from many different MS partners for both, although my guess is WF is a bit easier to get solutions support for (i.e. more partners have more consultants who know WF than K2).

Unfortunately, I don't have any experience with the Oracle product or the open source alternatives you mentioned, so I can't comment on those.

If you are overwhelmed, I recommend you take a look at the WF Virtual Labs (bottom of the page). They will let you get your hands on the technology, get the lingo down, go through a few scenarios. Once you have that, understanding how WF can fit into what you trying to do should be substantially easier. Also, I can recommend Essential Windows Workflow -- very good book. Here's a good intro on WF 4.0 from PDC.

like image 31
JP Alioto Avatar answered Oct 26 '22 12:10

JP Alioto