L'intégration d'une définition de sous-processus dans JBPM JPDL
Question
J'utilise la définition du processus langage jPDL du moteur de workflow JBoss. JBPM
Je veux intégrer un processus très simple graphique de définition: Fondamentalement, j'ai une définition de processus principal ( simples / processdefinition.xml ) y compris:
- un nœud Démarrer,
- un noeud d'état du processus,
- un noeud final.
Voici la définition du graphique:
<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>
Dans le nœud d'état de processus I définie a Sous-processus graphique ( subsimple / processdefinition.xml ) contenant:
- un nœud Démarrer,
- un nœud d'État,
- un noeud final.
Voici la définition du graphique:
<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>
Voici le actionHandler alloué à tous les événements et les transitions:
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"));
}
}
Finalement, voici le Classe principale à partir de laquelle je commence le processus:
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();
}
}
Comme je l'ai lu sur le forum JBoss, je définis correctement binding=late
sur la sous-processus de liaison dans la définition principale du processus. Alors j'ai essayé différentes façons d'instancier la définition du processus du sous-processus, mais je reçois toujours l'exception suivante lorsque vous essayez d'entrer dans le sous-état / nœud sous-processus:
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)
Quelqu'un peut-il me donner des conseils sur la façon de gérer la définition des sous-processus et l'utilisation?
La solution
J'ai finalement trouvé un moyen de sortir par moi-même:
-
Tout d'abord, une seule
instance.signal();
est nécessaire à l'impulsion l'ensemble des processus trail enmain()
. -
Ensuite, une interface doit être mis en œuvre pour permettre jBPM de rechercher et instancier les sous-processus requis:
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; } }
-
Finalement, un fichier de configuration de jBPM doit être spécifiée pour cartographier le résolveur cadre jBPM à celui mis en œuvre:
<jbpm-configuration> <bean name="jbpm.sub.process.resolver" class="com.sample.resolver.DbSubProcessResolver" /> </jbpm-configuration>
... et il fonctionne très bien!