L'integrazione di una definizione sottoprocesso in JBPM JPDL
Domanda
sto usando il linguaggio di definizione del processo jPDL dal motore JBoss flusso di lavoro:. JBPM
Voglio integrare un semplice processo grafico definizione: Fondamentalmente, ho una definizione del processo principale ( semplice / processdefinition.xml ) tra cui:
- un nodo Start
- un nodo di stato del processo,
- un nodo finale.
Ecco la definizione del grafico:
<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>
All'interno del nodo Stato di processo definito un Sub-Process grafico ( subsimple / processdefinition.xml ) contenente:
- un nodo Start
- un nodo Stato,
- un nodo finale.
Ecco la definizione del grafico:
<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>
Questa è la actionHandler assegnato a ogni eventi e transizioni:
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"));
}
}
Alla fine, qui è la Classe principale da cui comincio l'intero processo:
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();
}
}
Come ho letto su JBoss forum, ho binding=late
correttamente impostato sul legame nella definizione del processo principale sottoprocesso. Poi ho provato diversi modi per instanciate la definizione del processo del sub-processo, ma ho sempre trovato la seguente eccezione quando si cerca di accedere al sotto-Stato / node sotto-processo:
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)
Qualcuno può darmi consigli su come gestire la definizione sottoprocesso e l'uso?
Soluzione
Alla fine ho trovato una via d'uscita da sola:
-
Innanzitutto, un solo
instance.signal();
è necessario impulso vari processi di pista inmain()
. -
Quindi, un'interfaccia deve essere attuata per consentire jBPM cercare e instanciate sotto-processi necessari:
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; } }
-
Alla fine, un file di configurazione jBPM deve essere specificata per mappare il risolutore quadro jBPM alla implementato uno:
<jbpm-configuration> <bean name="jbpm.sub.process.resolver" class="com.sample.resolver.DbSubProcessResolver" /> </jbpm-configuration>
... e funziona benissimo!