JBPM笔记二一、流程变量1、连接线及信息号发送

JBPM笔记二


一、流程变量

1、连接线及信息号发送

<transition g="-83,-32" name="to state1" to="state1"/>

连接--

name--名称,如果一个连接没有name属性,则该线为默认的下一步。

to--连接到活动(节点)名称

当发送信息时,可以指定信号名称name,则将会把往指定名称的流向跳转。

executionService.signalExecutionById(pi.getId(),"to state2");


<state g="238,67,92,52" name="state1">

     <transition g="-49,-18" name="to state2" to="state2"/>

     <transition to="state4"/>

  </state>


2、流程变量

绑定到流程实例上的数据内容。


支持各种基本的类型,serializable的类型。



org.hibernate.LazyInitializationException: could not initialize proxy - no Session

如果流程变量中存的是一个持久化对象,要求对象不能是transient状态。必须有一个id。还要防止session关闭的问题。要用到OpenSessionInView模式,并确保业务层的Session与jbPM的Session是同一个。


解决方案:是流程变量中存持久化对象的id就可以。


3、设置流程变量

A、初始的时候创建流程变量

//创建流程变量

   Map<String,Object> vars=new HashMap<String,Object>();

   vars.put("user", "abc");

   vars.put("date", new Date());

   //起动带变量的流程实例

   executionService.startProcessInstanceByKey(pdkey,vars);

B、在流程实例运转的过程增加修改流程变量

设置某一个变量

executionService.setVariable(pi.getId(), "test", "11111:"+pi.findActiveActivityNames().iterator().next());

//批量设置变量的值

executionService.setVariables(pi.getId(), vars);  


4、如何读取流程变量

//读取某一个流程变量的值

   Object u= executionService.getVariable(pi.getId(), "user");

   ///获得所有变量的名称

   Set<String> names=executionService.getVariableNames(pi.getId());

   System.out.println("变量名:"+names);

   //获得所有流程变量的键值对

   Map<String,Object> vars=executionService.getVariables(pi.getId(), names);

   System.out.println("user:"+u);



二、任务Task简介


1、任务节点

<task name="借款申请" g="244,135,92,52" assignee="employee">

     <transition name="to 经理审批" to="经理审批" g="-66,-18"/>

  </task>


2、查找某一个人的待办任务


 //获得某一个人要输的任务

   List<Task> list= taskService.findPersonalTasks("employee");

   System.out.println("任务数:"+list.size());

   for(Task t:list){

     System.out.println(t);

     System.out.println(t.getAssignee()+":"+t.getCreateTime()+":"+t.getDuedate());

   }


3、办理一个任务

//1,办理这个任务,流到默认的下一步环节.    

   taskService.completeTask(taskId);*/

   //2,办完一个任务,并指定下一步的流转方向

   taskService.completeTask(taskId,"to end1");

   /*//3,办任务,并且指定任务变量,会存到流程实例变量中

   Map<String,Object> vars=new HashMap<String,Object>();

   vars.put("msg", "借5000块钱回家过年");

   taskService.completeTask(taskId, "to 经理审批",vars);*/


4、查询所有任务

//查询正办理中的任务

    TaskService taskService= JbpmUtil.getEngine().getTaskService();

    List<Task> list= taskService.createTaskQuery().list();

    //查询所有历史任务

    HistoryService historyService= JbpmUtil.getEngine().getHistoryService();

   List<HistoryTask> historyList= historyService.createHistoryTaskQuery().list();



三、基于jbpm的办公任务简单实例



四、JBPM API综合及源码查看

1、核心Service的API

A、RepositoryService

NewDeployment createDeployment();

void suspendDeployment(String deploymentId);--暂停

void resumeDeployment(String deploymentId);--重新起用

void deleteDeployment(String deploymentId);--删除

void deleteDeploymentCascade(String deploymentId);--级联删除流程部署及他所有流程实例,任务日志信息

Set<String> getResourceNames(String deploymentId);--获得部署中所有资源文件名称(jpdl.xml,png)

InputStream getResourceAsStream(String deploymentId, String resourceName);--获得承部署文件中某一个文件的内容。

ProcessDefinitionQuery createProcessDefinitionQuery();---查询流程定义信息

List<String> getStartActivityNames(String processDefinitionId);

String getStartFormResourceName(String processDefinitionId, String activityName);---在节点写form元素,得到流程定义中某一个活动的表单名称。

ActivityCoordinates getActivityCoordinates(String processDefinitionId, String activityName);--获得流程中某一个活动的图形座标值


Deployment   ProcessDefinition


B、ExecutionService

流程实例--->流程执行(Excution)(正在执行一个流程)


启动流程实例

ProcessInstance startProcessInstanceById(String processDefinitionId);

ProcessInstance startProcessInstanceByKey(String processDefinitionKey);

ProcessInstance startProcessInstanceByKey(String processDefinitionKey, String processInstanceKey);

ProcessInstance startProcessInstanceByKey(String processDefinitionKey, Map<String, ?> variables);

...

查询流程实例及执行中流程

ProcessInstance findProcessInstanceById(String processInstanceId);

Execution findExecutionById(String executionId);

ProcessInstanceQuery createProcessInstanceQuery();


//推进流程的api

ProcessInstance signalExecutionById(String executionId);

ProcessInstance signalExecutionById(String executionId, String signalName);

 ProcessInstance signalExecutionById(String executionId, String signalName, Map<String, ?> parameters);


设置流程实例的变量

void setVariable(String executionId, String name, Object value);

void setVariables(String executionId, Map<String, ?> variables);

...


查看流程实例变量


 Object getVariable(String executionId, String variableName);


 Set<String> getVariableNames(String executionId);


 Map<String, Object> getVariables(String executionId, Set<String> variableNames);


强制终止流程实例

void endProcessInstance(String processInstanceId, String state);

void deleteProcessInstance(String processInstanceId);

void deleteProcessInstanceCascade(String processInstanceId);


C、TaskService--任务管理,任务的查询,任务指派,任务添删改,任务变量设置等,任务完成。


D、HistoryService--用来查询jBPm中各种流程及流程流转过程产生的对象信息。


HistoryProcessInstanceQuery createHistoryProcessInstanceQuery();

HistoryActivityInstanceQuery createHistoryActivityInstanceQuery();

HistoryTaskQuery createHistoryTaskQuery();

HistoryDetailQuery createHistoryDetailQuery();


Map<String, Number> avgDurationPerActivity(String processDefinitionId);---查询流程活动的平均持续时间

Map<String, Number> choiceDistribution(String processDefinitionId, String activityName);--查询流程定义中某一个分支的选择的次数。


Set<String> getVariableNames(String processInstanceId);--所有变量名

Object getVariable(String processInstanceId, String variableName);

Map<String, ?> getVariables(String processInstanceId, Set<String> variableNames);


E、ManagementService管理工作任务JOB等

void executeJob(String jobId);

JobQuery createJobQuery();

 boolean deleteJob(long jobId);


F、IdentityService---用户及用户组管理的服务组件。



2、核心的领域模型(实体类,PO,值类VO  //数据传输对象DTO)

Deployment--流程部署信息

NewDeployment---新发部流程定义信息

ProcessDefinition--根据流程部署中流程文件信息解析出来流程定义对象。

Execution--执行的流程

ProcessInstance--流程实例

Execution findActiveExecutionIn(String activityName);--在某一个活动上是否有正在执行的流程。


Set<String> findActiveActivityNames();

Task--任务信息

Activity--活动

Transition--连接线



五、jBPM中的流程节点


1、state节点--等.发信号


2、decision节点--决策活动


A、通过condition节点来指定跳转

<decision g="254,214,48,48" name="exclusive1">

     <transition g="-49,-18" name="to state2" to="state2">

     <condition expr="#{age gt 10}"/>

     </transition>

     <transition g="-49,-18" name="to state3" to="state3">

      <condition expr="#{age lt 10}"/>

     </transition>

  </decision>


//设置流程实例变量

   exeService.setVariable(pi.getId(), "age", 8);

   exeService.signalExecutionById(pi.getId());


B、通过expr表达式来指定跳转


<decision expr="#{next}" g="254,214,48,48" name="exclusive1">

     <transition g="-49,-18" name="to state2" to="state2">

     </transition>

     <transition g="8,-13" name="to state3" to="state3">

     </transition>

  </decision>


exeService.setVariable(pi.getId(), "next", "to state3");

exeService.signalExecutionById(pi.getId());


C、设置Hanlder来进行决策

<decision g="254,214,48,48" name="exclusive1">

   <handler class="cn.itcast.gz.jbpm.MyDecisionHandler" >

   <property name="max"><int value="5"></int></property>

   </handler>

   <transition g="-49,-18" name="to state2" to="state2">

   </transition>

   <transition g="8,-13" name="to state3" to="state3">

   </transition>

 </decision>



public class MyDecisionHandler implements DecisionHandler {

 private Integer max=20;


 public void setMax(Integer max) {

   this.max = max;

 }


 @Override

 public String decide(OpenExecution execution) {

   System.out.println("执行流转判断");

   Map<String,?> vars= execution.getVariables();

   Integer age=(Integer)vars.get("age");

   return age>max?"to state2":"to state3";

 }


}


C、会签,并行走-fork-join


fork节点执行时,分走分支Execution,并且主流程实例不可用;只有当每一个分支走完后,才回到主流程实例。


<state g="361,238,92,52" name="state4">

     <transition name="to join1" to="join1" g="-41,-18"/>

  </state>

  <fork name="fork1" g="217,184,48,48">

     <transition name="to state2" to="state2" g="-49,-18"/>

     <transition name="to state4" to="state4" g="-49,-18"/>

  </fork>

  <join name="join1" g="504,197,48,48">

     <transition name="to state5" to="state5" g="-49,-18"/>

  </join>




六、任务详情


1、指定任务候选人

<task name="task1" g="228,129,92,52" candidate-users="test,abc,itcast">

     <transition name="to task2" to="task2" g="-44,-18"/>

  </task>


2、任务的领取

先查询某一个用户可以领取的任务(findGroupTasks(name);),然后再调用takeTask()方法来领取任务。


//返回可以由某一个用户来处理的任务,findGroupTasks

   //根据用户所在的组来查询

   List<Task>  tasks=taskService.findGroupTasks(name);

   System.out.println(tasks);

   //领取任务

   if(tasks.size()>0){

     System.out.println("领取任务....");

     taskService.takeTask(tasks.get(0).getId(), name);

   }


3、使用候选用户组来设置任务领取人

<task name="task1" g="228,129,92,52" candidate-groups="employee" >

     <transition name="to task2" to="task2" g="-44,-18"/>

  </task>


public void createUserAndGroup(){

   IdentityService userService=  JbpmUtil.getEngine().getIdentityService();

   //创建用户

   userService.createUser("itcast","传智","播客");

   //创建组

   userService.createGroup("employee");

   userService.createMembership("itcast", "employee");

 }


领任务

TaskService taskService= JbpmUtil.getEngine().getTaskService();

   String name="itcast";

   //返回可以由某一个用户来处理的任务,findGroupTasks

   //根据用户所在的组来查询

   List<Task>  tasks=taskService.findGroupTasks(name);

   System.out.println(tasks);


4、使用表达式从流程实例变量中来指定承办人

<task name="task1" g="228,129,92,52" assignee="#{o.name}" >

     <transition name="to task2" to="task2" g="-44,-18"/>

  </task>


Emp emp=new Emp();

   emp.setName("abc");

   vars.put("o", emp);


   //起动带变量的流程实例

   executionService.startProcessInstanceByKey(pdkey,vars);  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值