Using end-complete-process attribute of end-state
nizzy Jun 3, 2008 9:24 AMHi,
I have attached the update schema to the jira issue created by Tom.
This fixed the exception I was seeing. However I'm still not seeing the behaviour from the process execution that I would expect.
Could someone have a look at my test process definition and see if I'm doing something wrong
<?xml version="1.0" encoding="UTF-8"?> <process-definition xmlns="" name="forktest"> <start-state name="start"> <transition to="doThis1"></transition> </start-state> <node name="doThis1"> <transition to="fork1"></transition> </node> <fork name="fork1"> <transition to="wait for a" name="a"></transition> <transition to="wait for b" name="b"></transition> </fork> <node name="doThis2"> <action class="com.ecebs.sample.action.DoThis2ActionHandler"></action> <transition to="join1" name="success"></transition> <transition to="end - doThis2 failed" name="failure"></transition> </node> <node name="doThis3"> <action class="com.ecebs.sample.action.DoThis2ActionHandler"></action> <transition to="join1" name="success"></transition> <transition to="end - doThis3 failed" name="failure"></transition> </node> <join name="join1"> <transition to="wait state"></transition> </join> <state name="wait for a"> <transition to="doThis2"></transition> </state> <state name="wait for b"> <transition to="doThis3"></transition> </state> <state name="wait state"> <transition to="end"></transition> </state> <end-state name="end" /> <end-state name="end - doThis2 failed" end-complete-process='true'/> <end-state name="end - doThis3 failed" end-complete-process='true'/> </process-definition>
I set in the ContextInstance a variable that I use to define success or failure, i.e. if success then I call
ctx.leaveNode("success")
from my action handler, if it fails then I calll same method passing in failure.
I still dont see the process completing at the expected end-state which leads me to believe I'm doing something wrong, either in my process definition or my test code
test code is
@Test public void testFork() { if (log.isDebugEnabled()) { log.debug("inside testFork()"); } // Create an instance of the process definition. ProcessInstance instance = new ProcessInstance(processDefinition); debugState("new ProcessInstance()", instance); log.debug("ProcessId is " + instance.getId()); // Signal to Start Process log.info("Signaling: Start"); signal(instance, null); debugState("1. Start", instance); ContextInstance ctxInst = instance.getContextInstance(); ctxInst.setVariable("status", "failure"); // Signal: Waiting for a log.info("Signaling: Waiting for a"); signal(instance, "a"); debugState("2. signal(instance, \"wait for a\")", instance); ctxInst.setVariable("status", "success"); // Signal: Waiting for a log.info("Signaling: Waiting for b"); signal(instance, "b"); debugState("3. signal(instance, \"wait for b\")", instance); // Signal: Waiting for a log.info("Signaling: to exit wait"); signal(instance, null); debugState("3. signal(instance, \"null\")", instance); Assert.assertEquals(processDefinition.getNode("end - doThis2 failed"), instance.getRootToken().getNode()); //Assert.assertEquals(processDefinition.getNode("end"), instance.getRootToken().getNode()); } private void debugState(String action, ProcessInstance instance) { log.info("**************************************************"); log.info("just performed action: " + action); log.info("root token node: " + instance.getRootToken().getNode()); log.info("root token active children: " + instance.getRootToken().getActiveChildren()); log.info("**************************************************"); } private void signal(ProcessInstance instance, String childKey) { if (log.isDebugEnabled()) { log.debug("inside signal(instance, childKey = " + childKey + ")"); } Token rootToken = instance.getRootToken(); if (rootToken.hasActiveChildren()) { Map<?, ?> children = rootToken.getActiveChildren(); if (children.containsKey(childKey)) { Token childToken = (Token) children.get(childKey); childToken.signal(); } else { // TODO handle this String msg = "Root Token does not contain, " + childKey; log.debug(msg); throw new RuntimeException(msg); } } else { rootToken.signal(); } }
Help is much appreciated!