| Class | Ruote::Exp::ConcurrenceExpression |
| In: |
lib/ruote/exp/fe_concurrence.rb
|
| Parent: | FlowExpression |
The ‘concurrence’ expression applies its child branches in parallel (well it makes a best effort to make them run in parallel).
concurrence do
alpha
bravo
end
The concurrence expression takes a number of attributes that allow for sophisticated control (especially at merge time).
concurrence :count => 1 do
alpha
bravo
end
in that example, the concurrence will terminate as soon as 1 (count) of the branches replies. The other branch will get cancelled.
As said for :count, the remaining branches get cancelled. By setting :remaining to :forget (or ‘forget’), the remaining branches will continue their execution, forgotten.
concurrence :count => 1, :remaining => :forget do
alpha
bravo
end
By default, the workitems override each others. By default, the first workitem to reply will win.
sequence do
concurrence do
alpha
bravo
end
charly
end
In that example, if ‘alpha’ replied first, the workitem that reaches ‘charly’ once ‘bravo’ replied will have the payload as seen/modified by ‘alpha’.
The :merge attribute determines which branch wins the merge.
highest and lowest refer to the position in the list of branch. It‘s useful to set a fixed winner.
concurrence :merge => :highest do
alpha
bravo
end
makes sure that alpha‘s version of the workitem wins.
By default, the merge type is set to ‘override’, which means that the ‘winning’ workitem‘s payload supplants all other workitems’ payloads.
Setting :merge_type to :mix, will actually attempt to merge field by field, making sure that the field value of the winner(s) are used.
:isolate will rearrange the resulting workitem payload so that there is a new field for each branch. The name of each field is the index of the branch from ‘0’ to …
:stack will stack the workitems coming back from the concurrence branches in an array whose order is determined by the :merge attributes. The array is placed in the ‘stack’ field of the resulting workitem. Note that the :stack merge_type also creates a ‘stack_attributes’ field and populates it with the expanded attributes of the concurrence.
Thus
sequence do
concurrence :merge => :highest, :merge_type => :stack do
reviewer1
reviewer2
end
editor
end
will see the ‘editor’ receive a workitem whose fields look like :
{ 'stack' => [{ ... reviewer1 fields ... }, { ... reviewer2 fields ... }],
'stack_attributes' => { 'merge'=> 'highest', 'merge_type' => 'stack' } }
This could prove useful for participant having to deal with multiple merge strategy results.
Like the :count attribute controls how many branches have to reply before a concurrence ends, the :over attribute is used to specify a condition upon which the concurrence will [prematurely] end.
concurrence :over_if => '${f:over}'
alpha
bravo
charly
end
will end the concurrence as soon as one of the branches replies with a workitem whose field ‘over’ is set to true. (the remaining branches will get cancelled unless :remaining => :forget is set).
:over_unless needs no explanation.