现在的位置: 首页 > 综合 > 正文

jbpm 总结

2013年05月26日 ⁄ 综合 ⁄ 共 6570字 ⁄ 字号 评论关闭

关键字: 工作流

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对业务流程进行建模
部署流程定义
创建和启动流程实例
获取待办任务
执行任务
提交(结束)任务

抱歉!评论已关闭.