Andrew,
If I'm understanding you properly, the only major difference between the
business process workflow (the one I am writing) and the data integration
workflow you mention is that one requires human interaction, while the
other is handled by automated systems. Is that fairly accurate? If so, then
I could see my workflow engine being used for both types of workflows. I
have well-defined the human interaction of workflows, but never touched on
the automated aspect, though it was a consideration during the design of
the engine.
Let me give an example of what I understand an automated workflow to be.
Say we are running an e-commerce site and we want to create an automated
workflow for the ordering process. This is how the process should go:
1. Customer orders something
2. Payment is processed
3. Order confirmation email sent to customer
4. Order is shipped
5. Shipping confirmation email sent to customer
You could certainly just hardcode the "workflow" of each step, but then
there's not a lot of flexibility. For example, maybe you want to insert an
extra step later (i.e. quality control before shipping). You could use the
workflow engine I'm creating to handle this scenario. Let me explain how:
You would have several parts to your e-commerce site:
- Main web interface
- Payment processing thread
- Email thread for order confirmations
- Email thread for shipment confirmations
I use the term "thread", but this would be any process or web2py scheduler
instance that runs in the background waiting for something to do. You would
have a process waiting for payments to process and processes waiting for
emails to send. This could potentially be the workflow you would use for
the ordering and shipping process:
# auth_group 50 = Automated payment processor group
# auth_group 51 = Automated order confirmation email group
# auth_group 52 = Shipping group of people that package the order
# auth_group 53 = Automated shipment confirmation email group
workflow_engine.create_template('Process order',
Step('Process the payment', dict(group=50)),
Step('Send order confirmation email', dict(group=51)),
Step('Package and ship order', dict(group=52)),
Step('Send shipment confirmation email', dict(group=53))
)
The trick here being that you can assign workflows to groups. So if you
create a group for each background process, then those processes can
continually check to see if there are any workflows waiting on them. Once
they finish their job, they call:
workflow_engine.step_complete(workflow_id, as_group=50) # payment processor
is finished
Because it's designed to be as general as possible, you can have the best
of both worlds which this example demonstrates: mixing both human and
automated workflows into a single workflow.
Does this address you question?
Thanks