工作流系統研究切入點(如何去學習工作流的一個思路,這是一個業務流程的思路)
1.編寫流程定義
2.部署流程
3.加載流程
4.啓動流程
5.執行任務
6.完成任務
流程的定義:預定義的業務流轉邏輯
流程實例:業務的一次實際流轉過程
參與者:任務的執行者
活動(任務):組成流程定義的節點
活動實例:組成流程實例的元素
流轉:從一個節點到另一個節點這一行爲
工作列表:當前需要辦理的任務集合
工作流的核心組件,對流程實例進行管理
Token是和指針(運行期的概念)代表着一條執行路徑,指向當前流程中正在執行的節點在實例運行期間,tokens可能是一個樹形結構,同一時刻可能存在多個token但是隻有一個root token
-------------------------------------------------------------
針對Jbpm如何去按上面的思路去做呢?
1.流程的定義:可以用圖形化的工具也可以自己手工寫。
2.部署流程:通過加載xml文件,把xml信息轉換成java信息。發佈流程
JbpmContext jbpmContext=JbpmConfiguration.getInstance().createJbpmContext();
GraphSession graphSession=jbpmContext.getGraphSession();
ProcessDefinition processDefinition=ProcessDefinition.parseXmlResource("org/test/a.xml");
//部署流程定義,如果已經存在同名的定義,則版本號會自動累加
graphSession.deployProcessDefinition(processDefinition);
jbpmContext.close();
3.加載流程和啓動流程:
JbpmContext jbpmContext=JbpmConfiguration.getInstance().createJbpmContext();
GraphSession graphSession=jbpmContext.getGraphSession();
//加載流程的定義
ProcessDefinition processDefinition=graphSession.loadProcessDefinition(processDefinitionID);//這個Id是流程的Id
//創建流程實例,啓動流程
ProcessInstance processInstance=new ProcessInstance(processDefinition);
//此時,rootToken指向流程定義的第一個節點
jbpmContext.save(processInstance);
jbpmContext.close();
4.獲取工作列表
JbpmContext jbpmContext=JbpmConfiguration.getInstance().createJbpmContext();
TaskMgmtSession mgmtSession=jbpmContext.getTaskMgmtSession();
//只能獲取尚未完成的任務列表(代辦任務)
List list=taskMgmtSession.findTaskInstance(userId);//userid爲參與者的id
//如果需要靈活的列表獲取接口,需要直接使用hibernate session對象對數據進行查詢
TaskInstance instance=mgmtSession.getTaskInstance(Long.parseLong(taskId));
//這兩種獲取列表的方式不太一樣,第一個返回List,第二個返回TaskInstance對象
5.執行任務
JbpmContext jbpmContext=JbpmConfiguration.getInstance().createJbpmContext();
TaskMgmtSession mgmtSession=jbpmCotext.getTaskMgmtSession();
TaskInstance taskInstance=mgmtSession.getTaskInstance(Long.parseLong(taskId));
taskInstance.start(); //start方法的調用標識着一個任務執行的開始,任務的開始時間會被填充
jbpmContext.save(taskInstance);
jbpmContext.close();
6.結束任務
JbpmContext jbpmContext=JbpmConfiguration.getInstance().createJbpmContext();
TaskMgmtSession mgmtSession=jbpmContext.getTaskMgmtSession();
TaskInstance taskInstance=mgmtSession.getTaskInstance(Long.parseLong(taskId));
taskInstance.end();
jbpmContext.save(taskInstance);
jbpmContext.close();
//end方法的調用1.當前的任務實例結束,任務結束時間會被填充。2.下一個節點的初始化3.當前任務的結束和下一
//個流程的開始是在一個事物內完成,從而保證了數據的完成性
-------------------------
如何給任務設置參與者
1.用變量傳遞參與者Id
值一般的web層確定
2.定義配置
<task-node name="collection">
<task>
<assignment class="com.modern.Test">
<assignment actor-id='#{userid}'>
</task>
</task-node>
3.Handler實現
public class F implements AssignmentHandler{
public void assign(Assignable arg0,ExecutionContext arg1)throws Exception{
String actorId=(String)arg1.getVariable("userId");
arg0.setActorId(actorId);
}
}
---------------------
Context標識着事物
它的的底層序列化是用hibernate實現的,createContext是開啓hibernatesession的過程,close 是關閉hibernatesession的過程
JbpmContext jbpmContext=JbpmConfiguration.getInstance().createJbpmContext();
try{
TaskInstance taskInstance=
.............do your process operations.............
}catch(Exception e){
}finally{
jbpmContext.close();
}
---------------------------------------
兩種session的用法:
GraphSession的典型用法
職責;GraphSession處理相關的數據持久化操作,主要是ProcessDefinition 和ProcessInstance
TaskMgmtSession 的典型用法:
職責:1.TaskInstance相關的數據的查詢操作
2.TaskInstance數據通過ProcessInstance進行保存它沒有save方法,save是通過對processInstance的操作實現的
**********************************
jbpm是工作流的一種
jbpm_processdefinition 是工作流的流程定義
jbpm_processInstance是工作流的實例
jbpm_id_user是一個參與者
jbpm_token是這Token的一個表,其中node記錄正在執行的節點
jbpm_bytearray存所上傳的3個文件,生成圖片是爲了流程跟蹤
jbpm_byteblock存的是上傳文件裏的內容