<?xml version="1.0" encoding="UTF-8"?>
<process-definition xmlns="urn:jbpm.org:jpdl-3.1" name="example_5">
<start-state name="開始">
<event type="node-leave">
<action name="action1"></action>
</event>
<transition name="tr1" to="工作中"></transition>
<transition name="tr2" to="求學中"></transition>
</start-state>
<state name="工作中">
<event type="node-enter">
<action name="工作" class="com.wide.example5.WorkAction"></action>
</event>
<transition name="" to="終成正果"></transition>
</state>
<state name="求學中">
<event type="node-enter">
<action name="學習" class="com.wide.example5.StudyAction"></action>
</event>
<transition name="" to="終成正果"></transition>
</state>
<end-state name="終成正果">
<event type="node-enter">
<action name="圓滿" class="com.wide.example5.EndAction"></action>
</event>
</end-state>
</process-definition>
這是一個比較簡單的jbpm流程模板,通過這幾天的學習(基本上是看別人的事子)發現jbpm原來這么的復雜的,好多東西想記下來,特別是一個同行總結出的例子,非常簡潔的描述了各個小功能點。以下也是一個很簡單的jpdl模板,清楚的描述了note與state的區別。jbpm提供了好幾種不同的節點。<process-definition xmlns="urn:jbpm.org:jpdl-3.1" name="example_5">
<start-state name="開始">
<event type="node-leave">
<action name="action1"></action>
</event>
<transition name="tr1" to="工作中"></transition>
<transition name="tr2" to="求學中"></transition>
</start-state>
<state name="工作中">
<event type="node-enter">
<action name="工作" class="com.wide.example5.WorkAction"></action>
</event>
<transition name="" to="終成正果"></transition>
</state>
<state name="求學中">
<event type="node-enter">
<action name="學習" class="com.wide.example5.StudyAction"></action>
</event>
<transition name="" to="終成正果"></transition>
</state>
<end-state name="終成正果">
<event type="node-enter">
<action name="圓滿" class="com.wide.example5.EndAction"></action>
</event>
</end-state>
</process-definition>
<?xml version="1.0" encoding="UTF-8"?>
<process-definition xmlns="urn:jbpm.org:jpdl-3.1" name="example_7">
<start-state name="start">
<transition name="tr1" to="state"></transition>
<transition name="tr2" to="node"></transition>
</start-state>
<state name="state"> <!-- 只有簽收signal才執行 -->
<transition name="" to="end"></transition>
</state>
<node name="node"> <!-- 直接執行,當流轉到這節點時,就馬上執行transition -->
<transition name="" to="end"></transition>
</node>
<end-state name="end"></end-state>
</process-definition>
測試代碼也很簡單,<process-definition xmlns="urn:jbpm.org:jpdl-3.1" name="example_7">
<start-state name="start">
<transition name="tr1" to="state"></transition>
<transition name="tr2" to="node"></transition>
</start-state>
<state name="state"> <!-- 只有簽收signal才執行 -->
<transition name="" to="end"></transition>
</state>
<node name="node"> <!-- 直接執行,當流轉到這節點時,就馬上執行transition -->
<transition name="" to="end"></transition>
</node>
<end-state name="end"></end-state>
</process-definition>
package com.jbpm;
import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.db.GraphSession;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.exe.ProcessInstance;
import org.jbpm.graph.exe.Token;
import java.io.*;
public class Execute {
static JbpmConfiguration cfg=JbpmConfiguration.getInstance();
/**
* 把流程部署到數據庫
* @param file
*/
public void deploy(String file){
JbpmContext jc=null;
try{
FileInputStream fis = new FileInputStream("src/proc2.xml");
ProcessDefinition pd=ProcessDefinition.parseXmlInputStream(fis);
jc=cfg.createJbpmContext();
jc.deployProcessDefinition(pd);
}catch(Exception e){
e.printStackTrace();
}finally{
jc.close();
}
}
public static void main(String args[])throws Exception {
Execute e=new Execute();
//e.deploy("src/proc2");
JbpmContext jc=cfg.createJbpmContext();
GraphSession gs=jc.getGraphSession();
ProcessDefinition pd=gs.findLatestProcessDefinition("example_5");
ProcessInstance pi=new ProcessInstance(pd);
Token token=pi.getRootToken();
System.out.println("token-->"+token.getNode().getName());
token.signal("tr1");
System.out.println("tr1-->"+token.getNode().getName());
token.signal();
System.out.println("kk->"+token.getNode().getName());
System.out.println("是否已結束->"+pi.hasEnded());
jc.save(pi);
}
}
以上這個類對應第一個工作流模板,至于該模板里定義的接口,import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.db.GraphSession;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.exe.ProcessInstance;
import org.jbpm.graph.exe.Token;
import java.io.*;
public class Execute {
static JbpmConfiguration cfg=JbpmConfiguration.getInstance();
/**
* 把流程部署到數據庫
* @param file
*/
public void deploy(String file){
JbpmContext jc=null;
try{
FileInputStream fis = new FileInputStream("src/proc2.xml");
ProcessDefinition pd=ProcessDefinition.parseXmlInputStream(fis);
jc=cfg.createJbpmContext();
jc.deployProcessDefinition(pd);
}catch(Exception e){
e.printStackTrace();
}finally{
jc.close();
}
}
public static void main(String args[])throws Exception {
Execute e=new Execute();
//e.deploy("src/proc2");
JbpmContext jc=cfg.createJbpmContext();
GraphSession gs=jc.getGraphSession();
ProcessDefinition pd=gs.findLatestProcessDefinition("example_5");
ProcessInstance pi=new ProcessInstance(pd);
Token token=pi.getRootToken();
System.out.println("token-->"+token.getNode().getName());
token.signal("tr1");
System.out.println("tr1-->"+token.getNode().getName());
token.signal();
System.out.println("kk->"+token.getNode().getName());
System.out.println("是否已結束->"+pi.hasEnded());
jc.save(pi);
}
}
<action name="工作" class="com.wide.example5.WorkAction"></action>
該class只需要實現ActionHandler接口就行了,具體有啥用我現也沒搞懂:)我一直努力著。