2015/01/23

One of a great features of BPMN (and not only) is the multi instance activity aka for each. To put it simple same activity is repeated for each item from input collection. That is usually good fit for distributing work across number of people to gather their input or opinion.
jBPM provides support for it since version 5 but it was enhanced with every version. Current support covers:

Equipped with that we can build powerful processes with simplified structure. Even more than that: it's all dynamic meaning number of instances can (and actually should as best practice) reference process variables for both input and output.

To show it in practice we go over an example that is based on Eric Shabell's Reward demo. It has been only slightly modified to focus mainly on the multi instance support jBPM comes with in version 6.2 community.

So what we have in this process?

When process start it will ask for some details about the person who shall receive award and its details

Once instance is started it will go into 'Associate Reviews' user task where associate needs to provide following information:

how many peer reviews should be performed

how many of them are required to move on without waiting for all to be completed

Once this information is available 'Setup Reviews' task will prepare all required structures and populate process variables that will feed multi instance subprocess

'Evaluate Award' task will be created multiple times based on (2.1) selection

Each instance of that user task will ask for approval and result of it will be kept in multi instance output collection

It has a completion condition that will evaluate result every time one instance of 'Evaluate Award' task is completed as soon as it becomes true it will move on and cancel remaining task instances of 'Evaluate Award'

'Calculate results' will be performed to check what output is collected - if award is approved or rejected and based on that will go to one of the paths.

both are of type java.util.ArrayList (they can be of any collection type) and they will be used for configuring multi instance subprocess. Important to note is that both must be non null before they can be used in multi instance activity.

Next let's review how the multi instance activity is configured:

MI collection input - this is the collection which will be used to create individual instances of given activity. In other words, each element from that collection will be assigned to separate activity instance.

MI collection output - this is the collection which will collect results of execution of multi instance activity - will aggregate all results produced. This is optional as not every multi instance activity must produce result that shall be collected.

MI completion condition - expression (currently MVEL) that will be evaluated at every completion of activity instance and as soon as it becomes true it will leave multi instance activity even if not all instances are completed. Those not completed will be canceled.

MI data input - this is the variable name that will be given to individual activity instances produced by multi instance activity.

MI data output - this is the variable name where the output of individual activity instance will be stored. It's optional as not all activities must produce results

Last but not least let's take a look in details at the completion condition as it provide quite powerful way of controlling multi instance activity completion.

In case it won't be readable (or for copy paste reason) here is the expression:

($ in reviews_results if $ == true).size() == approvalsRequired;

so what does it say? In general it evaluates all items in the 'reviews_results' collection and counts all elements that has value set to 'true'. Next it compares its size with the 'approvalsRequired' process variable to check if already collected approvals is enough.

For those interested, this is MVEL projections example which gives very powerful option to operate on collections.

That would be all to this article. For complete runnable example visit github. You can directly clone it from your kie-workbench installation (aka jbpm console) and run it there. It comes with all required parts:

process

forms

data model

All configured and ready to be executed (just make sure you run on jBPM 6.2 or higher). Enjoy

2015/01/07

I am happy to announce that a talk and workshop about jBPM 6 has been accepted at DevConf 2015 in Brno.

Talk: jBPM - BPM Swiss knife

During the presentation jBPM will be introduced from the Process Engine
& framework perspective.The main goal of the session is to share
with the community of developers how they can improve their systems
implementations and integrations by using a high level, business
oriented methodology that will help to improve the performance of the
company. jBPM will help to keep the infrastructural code organized and
decoupled from the business knowledge. During the presentation the new
APIs and new modules in jBPM version 6 will be introduced for the
audience to have a clear spectrum of the tools provided.

Speaker: Maciej Swiderski

Workshop: Get your hands dirty with jBPM

This is continuation of the presentation of jBPM (jBPM - BPM swiss
knife) that introduces to jBPM while this is mainly focused on making
use of that knowledge in real cases. On this workshop users will be able
to see in action jBPM from both perspectives:

as a services when jBPM is used as BPM platform

as embedded when jBPM is used as a framework in custom applications

This workshop is intended to give a quick start with jBPM and help users
to decide which approach is most suitable for their needs.

Speakers:

Jiri Svitak

Maciej Swiderski

Radovan Synek

Schedule for the complete conference can be found here. See you there!!!