1、利用jpdl圖形設計器分析和設計流程
2、定義流程
3、加載和啓動jbpm流程定義、
A、利用JbpmConfiguration.createJbpmContext(),得到jbpmContext上下文對象;
B、再利用JbpmContext上下文對象得到GraphSession對象;
C、根據GraphSession對象來加載流程定義,根據流程定義id來加載得到流程定義對象;
D、創建流程實例:啓動流程
ProcessInstance processInstance = new ProcessInstance(processDefinition);
E、保存jbpmContext.save(processInstance);
F、關閉jbpmContext.close();
=======================================================================================
一、部署流程定義
JbpmContext jbpmContext = JbpmConfiguration.getInstance().createJbpmContext();
ProcessDefinition processDefinition = ProcessDefinition
.parseXmlResource(“jdpl/hello/processdefinition.xml");
//部署流程定義,如果已經存在同名的定義,則版本號會自動累加
jbpmContext. deployProcessDefinition(processDefinition);
jbpmContext.close();
======================================================================================
二、加載和開始流程
JbpmContext jbpmContext =JbpmConfiguration.getInstance.createJbpmContext();
GraphSession graphSession = jbpmContext.getGraphSession();
//加載流程定義
ProcessDefinition processDefinition = graphSession
.loadProcessDefinition(processDefinitionId);
// 創建流程實例:啓動流程
ProcessInstance processInstance = new ProcessInstance(processDefinition);
//此時,rootToken指向流程定義的第一個節點
jbpmContext.save(processInstance);
jbpmContext.close();
=====================================================================================
三、給任務設置參與者
某一個任務固定由某人處理:
<task-node name="collectform" >
<task >
<assignment actor-id=“manager” />"
</task>
<transition name="auditfork" to="auditfork" />
</task-node>
=====================================================================================
四、給任務設置參與者
用變量傳遞參與者的ID: 值一般在web層確定
定義配置:
<task-node name="collectform" >
<task >
<assignment class='org.ministone.training.jbpm.UserIdAssignmentHandler' />“
<assignment actor-id=‘#{userId}' />“
</task>
<transition name="auditfork" to="auditfork" />
</task-node>
Handler 實現
public class UserIdAssignmentHandler implements AssignmentHandler {
public void assign(Assignable assignable, ExecutionContext executionContext) throws Exception {
String actorId = (String) executionContext.getVariable("userId");
assignable.setActorId(actorId);
}
}
=====================================================================================
五、獲取工作列表
獲取待辦列表:
JbpmContext jbpmContext = JbpmConfiguration.getInstance().createJbpmContext();
TaskMgmtSession taskMgmtSession = jbpmContext.getTaskMgmtSession();
//只能獲取尚未完成的任務列表(待辦任務)
List list = taskMgmtSession.findTaskInstances(userId);
jbpmContext.close();
在實際的應用中,需要自己寫DAO來獲取各種列表,例如待籤、待辦、已辦、辦結等列表,而且可以進行條件查詢,分頁等
======================================================================================
六、執行任務
典型代碼:取得某個任務id對應的任務實例
JbpmContext jbpmContext = JbpmConfiguration.getInstance().createJbpmContext();
TaskMgmtSession taskMgmtSession = jbpmContext.getTaskMgmtSession();
TaskInstance taskInstance = taskMgmtSession.loadTaskInstance(id);
taskInstance.start();
jbpmContext.save(taskInstance);
jbpmContext.close();
start()方法的調用
標識着一個任務的執行的開始:任務的開始時間字段會被填充
在實際業務中類似簽收的作用
也可以帶入參數(actorId)來主動參與任務的執行
======================================================================================
七、如何結束任務
典型代碼:
JbpmContext jbpmContext = JbpmConfiguration.getInstance().createJbpmContext();
TaskMgmtSession taskMgmtSession = jbpmContext.getTaskMgmtSession();
TaskInstance taskInstance = taskMgmtSession.loadTaskInstance(id);
taskInstance.end();
jbpmContext.save(taskInstance);
jbpmContext.close();
end 方法的調用
當前任務實例的結束:任務的結束時間字段會被填充
下一個節點的初始化(實際上調用了token.signal()方法)
當前任務的結束和下一個流程節點的開始是在一個事務內完成,從而保證了數據的完整性
======================================================================================
八、設置(流程實例)變量
變量用來處理工作流相關數據
不需要定義
和流程實例信息一起被持久化
變量的訪問和賦值是在某一個token上進行的,缺省時,是基於root Token
變量的作用域和所屬的token的生命週期一致,分支上同名變量互不影響,和parent的同名變量也互不影響
典型代碼:
JbpmContext jbpmContext = JbpmConfiguration.getInstance().createJbpmContext();
GraphSession graphSession = jbpmContext.getGraphSession();
ProcessInstance processInstance = graphSession.loadProcessInstance(Long
.parseLong(instanceId));
ContextInstance contextInstance = processInstance.getContextInstance();
contextInstance.setVariable(vname, value); //設置到了rootToken
jbpmContext.save (processInstance);
jbpmContext.close();
====================================================================================
九、對JbpmContext的理解(-)
職責
封裝了對流程實例的持久化操作
用於獲取GraphSession對象;
主要方法
Connection getConnection()
Session getSession()
public GraphSession getGraphSession()
public TaskMgmtSession getTaskMgmtSession()
public LoggingSession getLoggingSession()
public SchedulerSession getSchedulerSession()
public void close()
理解(二)
典型用法
JbpmContext jbpmContext = JbpmConfiguration.getInstance().createJbpmContext();
try {
TaskInstance taskInstance = ...
...do your process operations..............
jbpmContext.save(taskInstance);
}catch(Throwable){
//process exception here
}
finally {
jbpmContext.close();
}
理解(三)
web.xml中的配置
filter>
<filter-name>JbpmContextFilter</filter-name>
<filter-class>org.jbpm.web.JbpmContextFilter</filter-class>
</filter>
……
<filter-mapping>
<filter-name>JbpmContextFilter</filter-name>
<url-pattern>/wfapp/*</url-pattern>
</filter-mapping>
jsp頁面上 <%
JbpmContext jbpmContext = JbpmConfiguration.getInstance().getCurrentJbpmContext();
List list = jbpmContext.getGraphSession().findLatestProcessDefinitions();
for (int i = 0; i < list.size(); i++) {
ProcessDefinition pd = (ProcessDefinition)list.get(i);
%>
<tr><td><%=pd.getName()%></td><td><%=pd.getVersion()%></td> </tr>
<% } %> <!– 不需要關閉-->
======================================================================================
十、對GraphSession的理解
職責
Graph 相關的數據持久化操作
主要是ProcessDefinition和ProcessInstance
主要方法
public void saveProcessDefinition( ProcessDefinition processDefinition )
public ProcessDefinition loadProcessDefinition(long processDefinitionId)
public ProcessDefinition findProcessDefinition(String name, int version)
public List findAllProcessDefinitions()
public void saveProcessInstance(ProcessInstance processInstance)
public ProcessInstance loadProcessInstance(long processInstanceId)
public List findProcessInstances(long processDefinitionId)
Delete方法
=====================================================================================
十一、TaskMgmtSession的理解
職責
TaskInstance相關的數據查詢操作
TaskInstance數據通過ProcessInstance進行保存
主要方法
public List findTaskInstances(String actorId)
public List findPooledTaskInstances(String actorId)
public List findTaskInstancesByToken(long tokenId)
public TaskInstance loadTaskInstance(long taskInstanceId)
沒有save方法,save是通過對processInstance的操作實現的
======================================================================================
總結:
一、jBPM編程步驟總結
創建流程定義
部署流程定義
啓動流程實例
獲取任務列表
執行某個任務
結束任務
二、工作流應用一般開發步驟
分析業務流程、用jPDL對業務流程進行建模
部署流程定義
創建和啓動流程實例
獲取待辦任務
執行任務
提交(結束)任務
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/frank3G/archive/2010/02/04/5287700.aspx