ConcurrenceExpression
This expression is a cross between 'concurrence' and 'iterator'.
pdef = Ruote.process_definition :name => 'test' do
concurrent_iterator :on_val => 'alice, bob, charly', :to_var => 'v' do
participant '${v:v}'
end
end
will be equivalent to
pdef = Ruote.process_definition :name => 'test' do
concurrence do
participant 'alice'
participant 'bob'
participant 'charly'
end
end
The 'on' and the 'to' attributes follow exactly the ones for the iterator expression.
When there is no 'to', the current iterated value is placed in the variable named 'i'.
The variable named 'ii' contains the current iterated index (an int bigger or egal to 0).
'concurrent_iterator' does not understand commands like rewind/break/jump/... like 'iterator' does, since it fires all its branches when applied.
Similarly to the iterator expression, the :times or the :branches attribute may be used in stead of the 'on' attribute.
pdef = Ruote.process_definition :name => 'test' do
concurrent_iterator :times => 3 do
participant 'user${v:i}'
end
end
is equivalent to
pdef = Ruote.process_definition :name => 'test' do
concurrence do
participant 'user0'
participant 'user1'
participant 'user2'
end
end
the concurrent_iterator accepts the same options for merging as its bigger brother, the concurrence expression.
:count, :merge (override, mix, isolate), remaining (cancel, forget) and :over.
The 'add_branches'/'add_branch' expression can be used to add branches to a concurrent-iterator while it is running.
concurrent_iterator :on => 'a, b, c' do
sequence do
participant :ref => 'worker_${v:i}'
add_branches 'd, e', :if => '${v:/not_sufficient}'
end
end
In this example, if the process level variable 'not_sufficient' is set to true, workers d and e will be added to the iterated elements.
Read more at the 'add_branches' expression description.
# File lib/ruote/exp/fe_concurrent_iterator.rb, line 128 def add_branches (list) if h.times_iterator && list.size == 1 count = (list.first.to_i rescue nil) list = (h.list_size + 1..h.list_size + count) if count end list.each do |val| h.list_size += 1 workitem = Ruote.fulldup(h.applied_workitem) variables = { 'ii' => h.list_size - 1 } if h.to_v variables[h.to_v] = val else #if to_f workitem['fields'][h.to_f] = val end launch_sub( "#{h.fei['expid']}_0", tree_children[0], :workitem => workitem, :variables => variables) end end
Overrides FlowExpression#register_child to make sure that persist is not called.
# File lib/ruote/exp/fe_concurrent_iterator.rb, line 123 def register_child (fei) h.children << fei end
# File lib/ruote/exp/fe_concurrent_iterator.rb, line 178 def apply_children return reply_to_parent(h.applied_workitem) unless tree_children[0] list = determine_list return reply_to_parent(h.applied_workitem) if list.empty? h.to_v, h.to_f = determine_tos h.to_v = 'i' if h.to_v.nil? && h.to_f.nil? h.list_size = 0 add_branches(list) persist_or_raise end
Overrides the implementation found in ConcurrenceExpression
# File lib/ruote/exp/fe_concurrent_iterator.rb, line 198 def expected_count h.ccount ? [ h.ccount, h.list_size ].min : h.list_size end
Generated with the Darkfish Rdoc Generator 2.