Frage

Ich bin mit der Prozessdefinition Sprache jPDL vom JBoss Workflow-Engine. JBPM

Ich möchte eine sehr einfache Prozess Definition Graph integrieren: Grundsätzlich habe ich eine Hauptprozessdefinition ( simple / processdefinition.xml ), einschließlich:

  • ein Startknoten,
  • a Prozesszustandsknoten,
  • ein Endknoten.

Hier ist die Definition des Graphen:

<process-definition 
  xmlns="urn:jbpm.org:jpdl-3.2"
  name="simple">
   <start-state name="start">
        <transition name="to_state" to="process-state">
         <action name="action" class="com.sample.action.MessageActionHandler">
            <message>
                    Going to the sub-state!
                </message>
         </action>
      </transition>
        <event type="node-leave">
            <action class="com.sample.action.MessageActionHandler">
                <message>
                    Start.
                </message>
            </action>
        </event>
   </start-state>
   <process-state name="process-state">
        <sub-process name="subsimple" binding="late"/>
        <variable access="read,write" name="message" mapped-name="message">        </variable>
        <event type="node-enter">
            <action class="com.sample.action.MessageActionHandler"></action>
        </event>
        <transition to="end" name="to_end"></transition>
    </process-state>
   <end-state name="end">
        <event type="node-enter">
            <action class="com.sample.action.MessageActionHandler">
                <message>
                    End.
                </message>
            </action>
        </event>
    </end-state>
</process-definition>

innerhalb des Prozesszustandsknoten I definiert, um einen Sub-Prozess Graph ( subsimple / processdefinition.xml ) enthält:

  • ein Startknoten,
  • ein Staat Knoten,
  • ein Endknoten.

Hier ist die Definition des Graphen:

<process-definition 
  xmlns="urn:jbpm.org:jpdl-3.2"
  name="subsimple">
   <start-state name="start">
        <transition name="to_state" to="first">
         <action name="action" class="com.sample.action.MessageActionHandler">
            <message>Going to the first state!</message>
         </action>
      </transition>
        <event type="node-leave">
            <action class="com.sample.action.MessageActionHandler">
                <message>
                    Start.
                </message>
            </action>
        </event>
   </start-state>
   <state name="first">
      <event type="node-enter">
            <action class="com.sample.action.MessageActionHandler">
                <message>
                    In first state !!
                </message>
            </action>
        </event>
        <transition name="to_end" to="end">
         <action name="action" class="com.sample.action.MessageActionHandler">
            <message>
                    About to go out of sub-process !
                </message>
         </action>
      </transition>
   </state>
   <end-state name="end">
        <event type="node-enter">
            <action class="com.sample.action.MessageActionHandler">
                <message>
                    End.
                </message>
            </action>
        </event>
    </end-state>
</process-definition>

Dies ist die actionhandler zugewiesen alle Ereignisse und Übergänge:

public class MessageActionHandler implements ActionHandler {

    private static final long serialVersionUID = 1L;

    String message;

    public void execute(ExecutionContext context) throws Exception {
        context.getContextInstance().setVariable("message", message);

        System.out.println(context.getContextInstance().getVariable("message"));
    }
}

Schließlich ist hier die Hauptklasse aus dem ich den ganzen Prozess zu starten:

public class testJBPM {

public static void main(String[] args) {

    ProcessDefinition processDefinition = ProcessDefinition
            .parseXmlResource("simple/processdefinition.xml");

    // Create an instance of the process definition.
    ProcessInstance instance = new ProcessInstance(processDefinition);

    // Move the process instance from its start state to the first state.
    instance.signal();

    // Move the process instance to the end state.
    instance.signal();
}
}

lesen Wie ich auf JBoss Forum, ich richtig Satz binding=late auf Teilprozess in der Hauptprozessdefinition zu binden. Dann habe ich versucht verschiedene Möglichkeiten, die Prozessdefinition des Teilprozesses instanziieren aber ich habe immer die folgende Ausnahme erhalten beim Versuch, den Unterzustand / Teilprozess Knoten eingeben:

Exception in thread "main" org.jbpm.JbpmException: can't create a process instance     when processDefinition is null
    at org.jbpm.graph.exe.ProcessInstance.<init>(ProcessInstance.java:128)
    at org.jbpm.graph.exe.ProcessInstance.<init>(ProcessInstance.java:92)
    at org.jbpm.graph.exe.Token.createSubProcessInstance(Token.java:624)
    at org.jbpm.graph.node.ProcessState.execute(ProcessState.java:164)
    at org.jbpm.graph.def.Node.enter(Node.java:319)
    at org.jbpm.graph.def.Transition.take(Transition.java:151)
    at org.jbpm.graph.def.Node.leave(Node.java:394)
    at org.jbpm.graph.node.StartState.leave(StartState.java:70)
    at org.jbpm.graph.exe.Token.signal(Token.java:195)
    at org.jbpm.graph.exe.Token.signal(Token.java:140)
    at org.jbpm.graph.exe.ProcessInstance.signal(ProcessInstance.java:271)
    at com.sample.main.testJBPM.main(testJBPM.java:21)

Kann jemand gibt mir Ratschläge, wie Unterprozessdefinition und Verwendung verwalten?

War es hilfreich?

Lösung

Ich fand schließlich einen Weg-out von mir:

  • Zuerst wird nur ein instance.signal(); ist notwendig, die ganzen Prozesse in main() nachlaufen Impulse.

  • Dann hat eine Schnittstelle implementiert werden jBPM zu ermöglichen, zu suchen und instanziieren die erforderlichen Teilprozesse:

    public class DbSubProcessResolver implements SubProcessResolver {
        private static final long serialVersionUID = 1L;
    
            public ProcessDefinition findSubProcess(Element subProcessElement) {
    
                String name = subProcessElement.attributeValue("name").replaceAll(
                    "\\.", "");
                ProcessDefinition subProcessDefinition = ProcessDefinition
                    .parseXmlResource(name + "/processdefinition.xml");
    
                return subProcessDefinition;
            }
    }
    
  • Schließlich hat eine jBPM Konfigurationsdatei festgelegt werden, um den jBPM Rahmen Resolver auf die Umsetzung eines zur Karte:

    <jbpm-configuration>
        <bean name="jbpm.sub.process.resolver" class="com.sample.resolver.DbSubProcessResolver" />
    </jbpm-configuration>
    

... und es funktioniert gut!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top