7 Replies Latest reply on Sep 20, 2007 8:16 AM by Olivier Thierry

    Error introduced in 3.2.1

    Randy Gullett Newbie

      I have a process definition has the following scenario:
      - node 1, performs an action which calls executionContext.leaveNode() when done.

      - This does a default transition to a ProcessState, which has several nodes in it. All of their action handlers perform similarly to node 1.

      - Upon completion of the subprocess, The ProcessState then makes a default transition to another node whose action handler is again similar to node 1, and makes a default transition to the end-state.

      In 3.2-GA, this works without any difficulties, but in 3.2.1 it throws an exception saying that the current token is locked. Is this a bug or expected behavior? I don't have enough understanding of the purpose of token locking to really see how to change my code to work with it.

      Below is the log output. Thanks in advance for any help!



      [DEBUG] [GraphElement] - event 'before-signal' on 'StartState(start)' for 'Token(/)'
      [DEBUG] [GraphElement] - event 'node-leave' on 'StartState(start)' for 'Token(/)'
      [DEBUG] [GraphElement] - event 'transition' on 'Transition()' for 'Token(/)'
      [DEBUG] [GraphElement] - event 'node-enter' on 'Node(node 1)' for 'Token(/)'
      [DEBUG] [GraphElement] - executing action 'Action(a6af6e)'
      [DEBUG] [Token] - token[0] is locked by token[0]
      [DEBUG] [GraphElement] - event 'node-leave' on 'Node(node 1)' for 'Token(/)'
      [DEBUG] [GraphElement] - event 'transition' on 'Transition()' for 'Token(/)'
      [DEBUG] [GraphElement] - event 'node-enter' on 'ProcessState(processState)' for 'Token(/)'
      [DEBUG] [GraphElement] - event 'process-start' on 'ProcessDefinition(processState)' for 'Token(/)'
      [DEBUG] [GraphElement] - event 'subprocess-created' on 'ProcessState(processState)' for 'Token(/)'
      [DEBUG] [GraphElement] - event 'before-signal' on 'StartState(start)' for 'Token(/)'
      [DEBUG] [GraphElement] - event 'node-leave' on 'StartState(start)' for 'Token(/)'
      [DEBUG] [GraphElement] - event 'transition' on 'Transition()' for 'Token(/)'
      [DEBUG] [GraphElement] - event 'node-enter' on 'Node(myServiceNode)' for 'Token(/)'
      [DEBUG] [GraphElement] - executing action 'Action(5db5ae)'
      [DEBUG] [Token] - token[0] is locked by token[0]
      [DEBUG] [processStateHandler] - Handle calling processState service
      [DEBUG] [GraphElement] - event 'node-leave' on 'Node(myServiceNode)' for 'Token(/)'
      [DEBUG] [GraphElement] - event 'transition' on 'Transition()' for 'Token(/)'
      [DEBUG] [GraphElement] - event 'node-enter' on 'Decision(postprocessStateDecision)' for 'Token(/)'
      [DEBUG] [PostprocessStateDecisionHandler] - call processState decision handler
      [DEBUG] [Decision] - decision postprocessStateDecision is taking 'Transition(end)'
      [DEBUG] [GraphElement] - event 'node-leave' on 'Decision(postprocessStateDecision)' for 'Token(/)'
      [DEBUG] [GraphElement] - event 'transition' on 'Transition(end)' for 'Token(/)'
      [DEBUG] [GraphElement] - event 'node-enter' on 'EndState(end1)' for 'Token(/)'
      [DEBUG] [GraphElement] - event 'process-end' on 'ProcessDefinition(processState)' for 'Token(/)'
      [DEBUG] [Token] - token[0] is unlocked by token[0]
      [ERROR] [GraphElement] - action threw exception: this token is locked by token[0]
      org.jbpm.JbpmException: this token is locked by token[0]
      at org.jbpm.graph.exe.Token.signal(Token.java:184)
      at org.jbpm.graph.exe.Token.signal(Token.java:170)
      at org.jbpm.graph.exe.ProcessInstance.end(ProcessInstance.java:322)
      at org.jbpm.graph.exe.Token.notifyParentOfTokenEnd(Token.java:331)
      at org.jbpm.graph.exe.Token.end(Token.java:303)
      at org.jbpm.graph.exe.Token.end(Token.java:253)
      at org.jbpm.graph.node.EndState.execute(EndState.java:59)
      at org.jbpm.graph.def.Node.enter(Node.java:318)
      at org.jbpm.graph.def.Transition.take(Transition.java:151)
      at org.jbpm.graph.def.Node.leave(Node.java:393)
      at org.jbpm.graph.exe.ExecutionContext.leaveNode(ExecutionContext.java:136)
      at org.jbpm.graph.node.Decision.execute(Decision.java:152)
      at org.jbpm.graph.def.Node.enter(Node.java:318)
      at org.jbpm.graph.def.Transition.take(Transition.java:151)
      at org.jbpm.graph.def.Node.leave(Node.java:393)
      at org.jbpm.graph.def.Node.leave(Node.java:357)
      at org.jbpm.graph.exe.ExecutionContext.leaveNode(ExecutionContext.java:120)
      at com.xxx.ExecuteAndTransitionActionHandler.execute(ExecuteAndTransitionActionHandler.java:49)
      at org.jbpm.graph.def.Action.execute(Action.java:122)
      at org.jbpm.graph.def.GraphElement.executeAction(GraphElement.java:255)
      at org.jbpm.graph.def.Node.execute(Node.java:338)
      at org.jbpm.graph.def.Node.enter(Node.java:318)
      at org.jbpm.graph.def.Transition.take(Transition.java:151)
      at org.jbpm.graph.def.Node.leave(Node.java:393)
      at org.jbpm.graph.node.StartState.leave(StartState.java:70)
      at org.jbpm.graph.exe.Token.signal(Token.java:194)
      at org.jbpm.graph.exe.Token.signal(Token.java:139)
      at org.jbpm.graph.exe.ProcessInstance.signal(ProcessInstance.java:270)
      at org.jbpm.graph.node.ProcessState.execute(ProcessState.java:189)
      at org.jbpm.graph.def.Node.enter(Node.java:318)
      at org.jbpm.graph.def.Transition.take(Transition.java:151)
      at org.jbpm.graph.def.Node.leave(Node.java:393)
      at org.jbpm.graph.def.Node.leave(Node.java:357)
      at org.jbpm.graph.exe.ExecutionContext.leaveNode(ExecutionContext.java:120)
      at com.xxx.ExecuteAndTransitionActionHandler.execute(ExecuteAndTransitionActionHandler.java:49)
      at org.jbpm.graph.def.Action.execute(Action.java:122)
      at org.jbpm.graph.def.GraphElement.executeAction(GraphElement.java:255)
      at org.jbpm.graph.def.Node.execute(Node.java:338)
      at org.jbpm.graph.def.Node.enter(Node.java:318)
      at org.jbpm.graph.def.Transition.take(Transition.java:151)
      at org.jbpm.graph.def.Node.leave(Node.java:393)
      at org.jbpm.graph.node.StartState.leave(StartState.java:70)
      at org.jbpm.graph.exe.Token.signal(Token.java:194)
      at org.jbpm.graph.exe.Token.signal(Token.java:139)
      at org.jbpm.graph.exe.ProcessInstance.signal(ProcessInstance.java:270)
      at com.xxx.BaseWorkflowTestCase.initializeWorkflowManager(BaseWorkflowTestCase.java:73)
      at com.xxx.BaseWorkflowTestCase.setUp(BaseWorkflowTestCase.java:56)

        • 1. Re: Error introduced in 3.2.1
          Ronald van Kuijk Master

          do you have a testcase demonstrating this behaviour? The strange thing is that it first says unlocked then locked...

          • 2. Re: Error introduced in 3.2.1
            Randy Gullett Newbie

            Here's a junit test case and an ActionHandler that I wire in. It runs green in 3.2.GA, but fails in 3.2.1.

            Thanks,
            Randy



            package com.jbpm.test;
            import java.util.HashMap;
            import java.util.Map;

            import junit.framework.TestCase;

            import org.dom4j.Element;
            import org.jbpm.graph.def.ProcessDefinition;
            import org.jbpm.graph.exe.ProcessInstance;
            import org.jbpm.graph.node.ProcessState;
            import org.jbpm.graph.node.SubProcessResolver;

            public class JBPMDemoTestCase extends TestCase {

            public void testJbpm() {
            String className = DoNothingActionHandler.class.getName();
            ProcessInstance processInstance = initProcessInstance();
            assertEquals("Instance is in wrong state", "start", processInstance.getRootToken()
            .getNode().getName());
            processInstance.signal();

            }

            private ProcessInstance initProcessInstance() {
            MapBasedProcessRepository mapBasedProcessRepository = new MapBasedProcessRepository();
            ProcessState.setDefaultSubProcessResolver(mapBasedProcessRepository);
            ProcessDefinition subProcessDefinition =
            ProcessDefinition.parseXmlString(
            "<process-definition"
            + " xmlns='urn:jbpm.org:jpdl-3.2' name='subProcessName'>"
            + "<start-state name='start'>"
            + ""
            + "</start-state>"
            + "<end-state name='subProcessEndState'></end-state>"
            + ""
            + ""
            + ""
            + ""
            + "</process-definition>");

            mapBasedProcessRepository.add(subProcessDefinition);

            ProcessDefinition processDefinition =
            ProcessDefinition.parseXmlString(
            "<process-definition xmlns='' name='processName'>"
            + "<start-state name='start'>"
            + ""
            + "</start-state>"
            + "<end-state name='superProcessEnd'></end-state>"
            + "<process-state name='processState'>"
            + "<sub-process name='subProcessName' />"
            + "" + "</process-state>"
            + ""
            + ""
            + ""
            + ""
            + ""
            + ""
            + ""
            + ""
            + "</process-definition>");

            mapBasedProcessRepository.add(processDefinition);


            ProcessInstance processInstance = new ProcessInstance(processDefinition);
            return processInstance;
            }

            private static class MapBasedProcessRepository implements SubProcessResolver {

            protected MapBasedProcessRepository() {}

            private Map<String, ProcessDefinition> processes = new HashMap<String, ProcessDefinition>();

            public void add(ProcessDefinition processDefinition) {
            processes.put(processDefinition.getName(), processDefinition);
            }

            public ProcessDefinition findSubProcess(Element subProcessElement) {
            String processName = subProcessElement.attributeValue("name");
            return processes.get(processName);
            }

            }


            }



            package com.jbpm.test;

            import org.jbpm.graph.def.ActionHandler;
            import org.jbpm.graph.exe.ExecutionContext;

            public class DoNothingActionHandler implements ActionHandler {
            public DoNothingActionHandler() {

            }

            /**
            * @inheritDoc
            */
            public void execute(ExecutionContext executionContext) throws Exception {
            executionContext.leaveNode();
            }
            }




            • 3. Re: Error introduced in 3.2.1
              Ronald van Kuijk Master

              Randy,

              There might be some parts missing... can you post again and put the code in [ c o d e ] tags? (see the preview)

              • 4. Re: Error introduced in 3.2.1
                Randy Gullett Newbie

                Sorry about that. I think this one looks better. Note that the ActionHandler class goes in a separate file.

                package com.jbpm.test;
                import java.util.HashMap;
                import java.util.Map;
                
                import junit.framework.TestCase;
                
                import org.dom4j.Element;
                import org.jbpm.graph.def.ProcessDefinition;
                import org.jbpm.graph.exe.ProcessInstance;
                import org.jbpm.graph.node.ProcessState;
                import org.jbpm.graph.node.SubProcessResolver;
                
                public class JBPMDemoTestCase extends TestCase {
                
                 public void testJbpm() {
                 String className = DoNothingActionHandler.class.getName();
                 ProcessInstance processInstance = initProcessInstance();
                 assertEquals("Instance is in wrong state", "start", processInstance.getRootToken()
                 .getNode().getName());
                 processInstance.signal();
                
                 }
                
                 private ProcessInstance initProcessInstance() {
                 MapBasedProcessRepository mapBasedProcessRepository = new MapBasedProcessRepository();
                 ProcessState.setDefaultSubProcessResolver(mapBasedProcessRepository);
                 ProcessDefinition subProcessDefinition =
                 ProcessDefinition.parseXmlString(
                 "<process-definition"
                 + " xmlns='urn:jbpm.org:jpdl-3.2' name='subProcessName'>"
                 + "<start-state name='start'>"
                 + "<transition name='' to='subProcess Node 1'></transition>"
                 + "</start-state>"
                 + "<end-state name='subProcessEndState'></end-state>"
                 + "<node name='subProcess Node 1'>"
                 + "<action class='com.jbpm.test.DoNothingActionHandler'></action>"
                 + "<transition name='' to='subProcessEndState'></transition>"
                 + "</node>"
                 + "</process-definition>");
                
                 mapBasedProcessRepository.add(subProcessDefinition);
                
                 ProcessDefinition processDefinition =
                 ProcessDefinition.parseXmlString(
                 "<process-definition xmlns='' name='processName'>"
                 + "<start-state name='start'>"
                 + "<transition name='' to='node 1'></transition>"
                 + "</start-state>"
                 + "<end-state name='superProcessEnd'></end-state>"
                 + "<process-state name='processState'>"
                 + "<sub-process name='subProcessName' />"
                 + "<transition name='' to='node 2'></transition>" + "</process-state>"
                 + "<node name='node 2'>"
                 + "<transition name='' to='superProcessEnd'></transition>"
                 + "<action class='com.jbpm.test.DoNothingActionHandler'></action>"
                 + "</node>"
                 + "<node name='node 1'>"
                 + "<action class='com.jbpm.test.DoNothingActionHandler'></action>"
                 + "<transition name='' to='processState'></transition>"
                 + "</node>"
                 + "</process-definition>");
                
                 mapBasedProcessRepository.add(processDefinition);
                
                
                 ProcessInstance processInstance = new ProcessInstance(processDefinition);
                 return processInstance;
                 }
                
                 private static class MapBasedProcessRepository implements SubProcessResolver {
                
                 protected MapBasedProcessRepository() {}
                
                 private Map<String, ProcessDefinition> processes = new HashMap<String, ProcessDefinition>();
                
                 public void add(ProcessDefinition processDefinition) {
                 processes.put(processDefinition.getName(), processDefinition);
                 }
                
                 public ProcessDefinition findSubProcess(Element subProcessElement) {
                 String processName = subProcessElement.attributeValue("name");
                 return processes.get(processName);
                 }
                
                 }
                
                
                }
                
                package com.jbpm.test;
                
                import org.jbpm.graph.def.ActionHandler;
                import org.jbpm.graph.exe.ExecutionContext;
                
                public class DoNothingActionHandler implements ActionHandler {
                 public DoNothingActionHandler() {
                
                 }
                
                 /**
                 * @inheritDoc
                 */
                 public void execute(ExecutionContext executionContext) throws Exception {
                 executionContext.leaveNode();
                 }
                }
                
                
                
                


                • 5. Re: Error introduced in 3.2.1
                  Tomas Kunes Newbie

                  Hi, does it have any solution? I've the same problem.

                  Tomas

                  • 6. Re: Error introduced in 3.2.1
                    Olivier Thierry Apprentice

                    Hi, I have the same problem, I reported it here :
                    http://www.jboss.com/index.html?module=bb&op=viewtopic&t=119089

                    Did you find a solution ?

                    • 7. Re: Error introduced in 3.2.1
                      Olivier Thierry Apprentice

                      I had not seen that a new version was released a week ago. I upgraded to this version and there is no more problem ;)