jbpm3
共分爲12種節點
1.node節點:若是該節點沒有定義ACTION,則流轉到該節點時不會停留,會繼續往下走,若是定義ACTION,執行完ACTION後會停在該節點上,調用 token.signal後繼續流轉
node節點支持事件 node-enter,node-leave
2.state 節點 調用 token.signal後繼續流轉,不然會停下
3.tasknode 節點 該節點中能夠建立多個任務 task 一個task產生一個任務實例沒定義task會自動流轉 state 節點只能建立一個task
TaskMgmtInstance tmg = pi.getTaskMgmtInstance(); TaskInstance startTask = tmg.createStartTaskInstance();
任務實例生命週期 建立--開始--完成 取消--掛起
![](http://static.javashuo.com/static/loading.gif)
任務實例 掛起 表taskinstance issuspended = true 掛起後不能操做 查詢不到node
isopen = true 是否關閉 關閉後不能操做 查詢不到數據庫
action 當節點往下走的時候觸發當前的節點的action
若是一個節點有多個任務,調用signal 會隨機進入一個tasknode 根據流程實例獲取token 根據token獲取node,根據node獲取 levaingTranstaion, 可執行的Transtaion列表
流程節點條件判斷有三種方式1.在transtation 中定義變量,2在decode中定義表達式,在hadler中返回transtation ,3 繼承 JbpmVariableResolver(推薦)
jbpm 本身解析流程實例變量 繼承 JbpmVariableResolver 目的 不能寫那麼多個handler
查詢單獨非配給本身的私有任務列表 context.getTaskMgmtSession.findTaskInstances(actorid);
查詢所屬組的任務實例 context.getTaskMgmtSession.findPooledTaskInstance(actorid);
兩個集合要合併 才能查看該人的全部任務
查詢還沒有結束的任務實例
Collection taskInstances = executionContext.getTaskMgmtInstance().getUnfinishedTasks(tonke);
會籤
<task-node name = "審批" create-tasks="no" signal = "first" end-tasks="yes">
<event type="node-enter">
<action class="">
</action>
<task name="審批">
</task>
<task name="審批">
<event type = "task-end"> 在每一個任務實例被結束的時候
<action class="tActionHandler">
</action>
<event>
</task>
end-tasks="yes" 有一我的審批經過後繼續流轉,其餘人的任務都變成已完成
TaskMgmtInstance tmi = executionContext.getTaskMgmtInstance();
TaskNode tasknode = (TaskNode )executionContext.getNode();
Task task = tasknode.getTasks().iterator.next();
for(){
TaskInstance ti = tmi.createTaskInstance(task,executionContext);
ti.setActorId(username);
}
//----------------
Conllection allTaskInstances = tmi.getTaskInstances();//獲取當前流程實例下的全部任務實例
//獲取當前流程實例當前Token 的未完成的任務實例
Conllection unfinishedTasks = tmi.getUnfinishedTasks(currentToken);
利用變量表達式實現自由節點,本身解釋變量JbpmVariableResolver
//獲取配置文件對象 JbpmConfiguration configuration = JbpmConfiguration.getInstance(); //根據配置文件對象獲取jbpm上下文 JbpmContext context = configuration.createJbpmContext(); //根據上下文對象獲取與jbpm表打交道的GraphSession GraphSession graphSession = context.getGraphSession(); //根據GraphSession獲取流程定義對象 ProcessDefinition processDefinition = graphSession.findLatestProcessDefinition("sqj"); //根據流程模板建立流程實例 ProcessInstance instance = processDefinition.createProcessInstance(); //流程實例ID System.out.println(instance.getId()); //根據流程實例獲取流程實例上下文對象 ContextInstance contextInstance = instance.getContextInstance(); contextInstance.setVariable("username", "張小三"); //根據流程實例獲取任務管理器 TaskMgmtInstance taskMgmtInstance = instance.getTaskMgmtInstance(); //在開始節點中建立任務setActorId設置用戶,不能在handler中設置,在handler中設置不上 context.setActorId("張小三"); //SecurityHelper.getAuthenticatedActorId(); //手動進入開始任務 TaskInstance taskInstance = taskMgmtInstance.createStartTaskInstance(); //任務實例ID System.out.println(taskInstance.getId()); //往當前任務實例中添加任務實例參數 taskInstance.setVariable("nextname", "李四"); //結束任務向下流轉 //taskInstance.setActorId("張小三"); taskInstance.end("李四審批"); context.close();
UserHandler //獲取當前token Token token = executionContext.getToken(); //根據當前token獲取節點 Node node = token.getNode(); System.out.println(node.getName()); if(node.getName().equals("開始")){ String tusername = (String) executionContext.getVariable("username"); System.out.println(tusername); assignable.setActorId(tusername); //獲取當前的流程實例 //TaskInstance taskInstance = executionContext.getTaskInstance(); //taskInstance.setActorId(tusername); }else{ String tusername = (String) executionContext.getVariable("nextname"); System.out.println(tusername); //獲取當前的流程實例 TaskInstance taskInstance = executionContext.getTaskInstance(); taskInstance.setActorId(tusername); assignable.setActorId(tusername); }
public static void main(String[] args) { //建立流程模板 ProcessDefinition processDefinition = ProcessDefinition.parseXmlResource("helloword/processdefinition.xml"); //建立流程實例 ProcessInstance processInstance = new ProcessInstance(processDefinition); //獲取一個流程實例的上下文對象 //ContextInstance contextInstance = processInstance.getContextInstance(); //上下文對象存放臨時流程變量和獲取同名會覆蓋 //contextInstance.setTransientVariable("", ""); //contextInstance.addVariables(variables); //根據流程實例建立開始節點的任務實例 //TaskInstance taskInstance = processInstance.getTaskMgmtInstance().createStartTaskInstance(); //向任務實例當中寫入先關變量 //taskInstance.setVariable("money_count", ""); //結束任務實例流程的Token就進入下一節點 //taskInstance.end(); //流程節點 Token token = processInstance.getRootToken(); Node node = token.getNode(); //node節點不會觸發 System.out.println(node.getName()); //節點向下流轉一步 token.signal(); System.out.println(node.getName()); //判斷是否結束 //token.getProcessInstance().hasEnded(); //單例,線程安全,配置文件對象 JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance(); //主要做用建立jbpmContext上下文對象//發佈流程到數據庫 JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext(); //從當前線程中獲取上下文對象 //JbpmContext jbpmContext1 = jbpmConfiguration.getCurrentJbpmContext(); //建立數據庫表 從新調用會從新建立 //jbpmConfiguration.createSchema(); //刪除數據庫表 //jbpmConfiguration.dropSchema(); //獲取系統裏的任務調度服務對象 //jbpmConfiguration.getJobExecutor(); //開始系統的任務調度服務 //jbpmConfiguration.startJobExecutor(); //jbpmContext.getTaskList(); //根據當前人ID獲取任務列表 jbpmContext.getTaskList(""); //根據任務ID獲取任務節點 TaskInstance instance = jbpmContext.getTaskInstance(11); instance.end("贊成"); //根據最新的流程名稱獲取流程模板 //ProcessDefinition lastDefinition = jbpmContext.getGraphSession().findLatestProcessDefinition("helloword"); }
//發佈流程模板 String path = "E:/work/hello.zip"; JbpmContext context = JbpmConfiguration.getInstance().createJbpmContext(); InputStream inputStream = new FileInputStream(new File(path)); ZipInputStream zipInputStream = new ZipInputStream(inputStream); ProcessDefinition processDefinition = ProcessDefinition.parseParZipInputStream(zipInputStream); context.deployProcessDefinition(processDefinition); zipInputStream.close(); inputStream.close(); context.close();
//建立JBPM數據庫表 public static void createDB(){ //JbpmConfiguration configuration = JbpmConfiguration.getInstance(); JbpmConfiguration configuration = JbpmConfiguration.getInstance("hibernate.cfg.xml"); //configuration.createSchema(); } /** * 部署流程文件 * @param path */ public static void depFlow(String path){ //String path = "E:/liucheng/qingjia.zip"; JbpmContext context = null; InputStream inputStream = null; ZipInputStream zipInputStream = null; try { context = JbpmConfiguration.getInstance().createJbpmContext(); inputStream = new FileInputStream(new File(path)); zipInputStream = new ZipInputStream(inputStream); ProcessDefinition processDefinition = ProcessDefinition.parseParZipInputStream(zipInputStream); context.deployProcessDefinition(processDefinition); } catch (Exception e) { e.printStackTrace(); }finally{ try { zipInputStream.close(); inputStream.close(); context.close(); } catch (IOException e) { e.printStackTrace(); } } } /** * 開啓流程 * @param flowName */ public static void startFlow(String flowName){ JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance(); JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext(); GraphSession graphSession = jbpmContext.getGraphSession(); ProcessDefinition processDefinition = graphSession.findLatestProcessDefinition(flowName); ProcessInstance processInstance = new ProcessInstance(processDefinition); ContextInstance contextInstance = processInstance.getContextInstance(); contextInstance.createVariable("name", "張三"); processInstance.signal(); } public static void startFlow2(String flowName){ JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance(); JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext(); GraphSession graphSession = jbpmContext.getGraphSession(); ProcessDefinition processDefinition = graphSession.findLatestProcessDefinition(flowName); ProcessInstance pi = processDefinition.createProcessInstance(); TaskMgmtInstance tmg = pi.getTaskMgmtInstance(); TaskInstance startTask = tmg.createStartTaskInstance(); startTask.setVariableLocally("JitTaskVar", ""); startTask.end(); } /** * 獲取最新的全部流程模板 * @return */ public static List<ProcessDefinition> getAllLastProcessDefinitions(){ JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance(); JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext(); GraphSession graphSession = jbpmContext.getGraphSession(); List<ProcessDefinition> processDefinitions = graphSession.findLatestProcessDefinitions(); for (ProcessDefinition processDefinition : processDefinitions) { System.out.println("流程ID: "+processDefinition.getId()+"流程版本: "+processDefinition.getVersion()+" 流程名稱"+processDefinition.getName()); } jbpmContext.close(); return processDefinitions; } /** * 獲取當前人的任務列表 * @param actorId * @return */ public static List<Task> getAllTask(String actorId){ JbpmConfiguration configuration = JbpmConfiguration.getInstance(); JbpmContext context = configuration.createJbpmContext(); TaskMgmtSession mgmtSession = context.getTaskMgmtSession(); List<Task> tasks = mgmtSession.findTaskInstances(actorId); context.close(); return tasks; } /** * 獲取全部的流程版本 * @return */ public static List<ProcessDefinition> getAllDefinitions(){ JbpmConfiguration configuration = JbpmConfiguration.getInstance(); JbpmContext context = configuration.createJbpmContext(); GraphSession graphSession = context.getGraphSession(); List<ProcessDefinition> definitions = graphSession.findAllProcessDefinitions(); for (ProcessDefinition processDefinition : definitions) { System.out.println("流程ID: "+processDefinition.getId()+"流程版本: "+processDefinition.getVersion()+" 流程名稱"+processDefinition.getName()); } context.close(); return definitions; } /** * 獲取當前流程的全部版本 * @return */ public static List<ProcessDefinition> getAllDefinitions(String defName){ JbpmConfiguration configuration = JbpmConfiguration.getInstance(); JbpmContext context = configuration.createJbpmContext(); GraphSession graphSession = context.getGraphSession(); List<ProcessDefinition> definitions = graphSession.findAllProcessDefinitionVersions(defName); for (ProcessDefinition processDefinition : definitions) { System.out.println("流程ID: "+processDefinition.getId()+"流程版本: "+processDefinition.getVersion()+" 流程名稱"+processDefinition.getName()); } context.close(); return definitions; }