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