cancel
Showing results for 
Search instead for 
Did you mean: 

Parallel SubProcess and Boundaryevents

heri
Champ in-the-making
Champ in-the-making
I am new to activiti and trying to create a parallel subprocess with a timeout and an error boundary event. I have three problems which I can't seem to solve on my own:

1. despite setting isSequential="true" in the multiInstanceLoopCharacteristics element, the SubProcesses are executed sequentially.
2. the timeout boundary event is never triggered.
3. despite setting cancelActivity=true" in the boundaryElement element, the subprocess is not cancelled when an errorEvent is thrown. After all subprocesses have finished, I get the following exception:


org.activiti.engine.impl.pvm.PvmException: already taking a transition
   at org.activiti.engine.impl.persistence.entity.ExecutionEntity.take(ExecutionEntity.java:443)


My script looks as follows (should be importable in a unit-test):


<?xml version="1.0" encoding="UTF-8"?>

<definitions id="definitions"
             xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:activiti="http://activiti.org/bpmn"
             targetNamespace="Examples" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="
             http://www.omg.org/spec/BPMN/20100524/MODEL http://www.omg.org/spec/BPMN/2.0/20100501/BPMN20.xsd">


    <process id="testProcess" name="Test process">

        <startEvent id="start"/>
        <sequenceFlow sourceRef="start" targetRef="listTask"/>

        <scriptTask id="listTask" name="Create List" scriptFormat="groovy">
            <script>
                out:println "Task 1: creating list"
                def list = []
                list.add("item1")
                list.add("item2")
                execution.setVariable("list", list)
            </script>
        </scriptTask>


        <sequenceFlow sourceRef="listTask" targetRef="decisionSubprocess"/>

        <subProcess id="decisionSubprocess" name="Subprocess">
            <multiInstanceLoopCharacteristics
                    isSequential="false" activiti:collection="${list}"
                    activiti:elementVariable="item">
            </multiInstanceLoopCharacteristics>

            <startEvent id="decisionStart"/>
            <sequenceFlow sourceRef="decisionStart" targetRef="decisionTask"/>
            <scriptTask id="decisionTask" name="Decide" scriptFormat="groovy">
                <script>
                    sleep(3000)
                    out:println "List " + execution.getVariable("item")
                    execution.setVariable("accepted", 0)
                </script>
            </scriptTask>

            <sequenceFlow sourceRef="decisionTask" targetRef="notificationAccepted" />

            <exclusiveGateway id="notificationAccepted"/>
            <sequenceFlow sourceRef="notificationAccepted" targetRef="changesRejectedEvent">
                <conditionExpression>
                    ${accepted == 0}
                </conditionExpression>
            </sequenceFlow>

            <endEvent id="changesRejectedEvent">
                <errorEventDefinition errorRef="changesRejected"/>
            </endEvent>

            <sequenceFlow sourceRef="notificationAccepted" targetRef="decisionEnd">
                <conditionExpression>
                    ${accepted == 1}
                </conditionExpression>
            </sequenceFlow>

            <endEvent id="decisionEnd"/>
        </subProcess>
        <boundaryEvent id="timeoutEvent" attachedToRef="decisionSubprocess" cancelActivity="true">
            <timerEventDefinition>
                <timeDuration>PT2S</timeDuration>
            </timerEventDefinition>
        </boundaryEvent>

        <boundaryEvent id="errorEvent" attachedToRef="decisionSubprocess" cancelActivity="true">
            <errorEventDefinition errorRef="changesRejected"/>
        </boundaryEvent>

        <sequenceFlow sourceRef="timeoutEvent" targetRef="timeout"/>

        <scriptTask id="timeout" name="Post Timeout" scriptFormat="groovy">
            <script>
                out:println "Timeout occurred."
            </script>
        </scriptTask>

        <sequenceFlow sourceRef="errorEvent" targetRef="error"/>

        <scriptTask id="error" name="Post Decline" scriptFormat="groovy">
            <script>
                out:println "Some declined."
            </script>
        </scriptTask>

        <sequenceFlow sourceRef="error" targetRef="end"/>

        <sequenceFlow sourceRef="timeout" targetRef="end"/>

        <sequenceFlow sourceRef="decisionSubprocess"
                      targetRef="normalEnd"/>

        <scriptTask id="normalEnd" name="Post Accepted" scriptFormat="groovy">
            <script>
                out:println "All accepted."
            </script>
        </scriptTask>

        <sequenceFlow targetRef="end"
                      sourceRef="normalEnd"/>

        <endEvent id="end"/>

    </process>

</definitions>


Would be grateful if someone could point out the errors I made.
3 REPLIES 3

vasile_dirla
Star Contributor
Star Contributor
Hi,
Please provide a unit test showing this behaviour (it will be easier for all of us to investigate it)
http://forums.activiti.org/content/sticky-how-write-unit-test

heri
Champ in-the-making
Champ in-the-making
Sorry, not sure if there is an edit option in this forum, but I could not find one. I've created a visual represenation of the process using activiti designer for better understandability of what I am trying to achieve:

http://postimg.org/image/jgh5ysen5/

So I create a list in the first task, iterate over it using parallel subprocesses and each subprocess may either terminate correctly or throw an error event.

edit: thx Vasile, I have attached the zip (renamed to .txt).

vasile_dirla
Star Contributor
Star Contributor
ok, let's see what's happening..