What is the recommended way of aggregating back data from multi-instance call activity?
In our particular case, objects are passed to the call activity through the collection & element variable. After completion of mult-instance, we would like to store data in the output collection?
What is the recommend way?
If you make the multi-instance a sequential, then you can write your data back to the parent process instance using something like ~execution.getParentExecution().setVariable… (or you could use the Variables Mapping and Output mappings on the multi-instance. Call Activity is a little more complex as there are extra scopes (Parent Process > Call Activity Local Scope > Called Process Scope). When you do the set variable you can continually update a existing variable such as a Json Array (using Camunda’s SPIN lib)
If you are using parallel multi-instance, then you have to deal with parallel writes to the parent process and will hit DB locking issues: The ~best solution I have found is to create a execution listener on the sequence flow (arrow) that comes out of the call activity, set the call activity to async-after (so the transaction is completed before the execution listener is called), and then in the execution listener to write a script/delegate that does something like the following:
- Get the Call Activity “Activity Id” that is attached to the sequence flow
- Look up the Call Activity “Activity Instance ID” for that “Activity ID” in that process instance
- use the ~“getCalledProcessInstance()” which will give you the Process Instance ID that was created using the Call Activity
- Then do a historic variables instance query on the process instance id
- You will need to filter out local variables which can be done with checking if ProcessInstanceId == ActivityInstanceId (if they are equal then it is a process instance variable) (https://jira.camunda.com/browse/CAM-12675)
This will return you a list of Historic Variable Instances, and then you can parse those results as needed.