Activiti任务分配
分配任务负责人
一、固定分配
在进行业务流程建模时指定固定的任务负责人
在properties 视图中,填写Assignee 项为任务负责人。
注意:
由于固定分配方式,任务只管一步一步执行任务,执行到每一个任务将按照 bpmn 的配置去分配任务负责人。
二、表达式分配
1、UEL 表达式
Activiti 使用UEL 表达式,UEL 是java EE6 规范的一部分,UEL(Unified Expression Language)即统一表达式语言,activiti 支持两个UEL 表达式:UEL-value 和UEL-method。
1.1 UEL-value 定义
assignee 这个变量是activiti 的一个流程变量。
或:
user 也是activiti 的一个流程变量,user.assignee 表示通过调用user 的getter 方法获取值。
1.2 UEL-method 方式
userBean 是spring 容器中的一个bean,表示调用该bean 的getUserId()方法。
1.3 UEL-method 与UEL-value 结合
${ldapService.findManagerForEmployee(emp)}
ldapService 是spring 容器的一个bean,findManagerForEmployee 是该bean 的一个方法,emp 是activiti流程变量,emp 作为参数传到ldapService.findManagerForEmployee 方法中。
1.4 其它
表达式支持解析基础类型、bean、list、array 和 map,也可作为条件判断。如下:
${order.price > 100 && order.price < 250}
三、使用流程变量分配任务
1、定义任务分配流程变量
2、设置流程变量
在启动流程实例时设置流程变量,如下:
package com.zn; import org.activiti.engine.*;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test; import java.util.HashMap;
import java.util.List;
import java.util.Map; public class ActivitiTest {
/**
* 流程部署
*/
@Test
public void deployment() {
//获取ProcessEngine对象 默认配置文件名称:activiti.cfg.xml 并且configuration的Bean实例ID为processEngineConfiguration
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取RepositoryService对象进行流程部署
RepositoryService repositoryService = processEngine.getRepositoryService();
//进行部署,将对应的流程定义文件生成到数据库当中,作为记录进行保存
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("bmpnfiles/holiday.bpmn") //加载流程文件
.addClasspathResource("bmpnfiles/holiday.png")
.name("请假流程-任务分配") //设置流程名称
.key("holiday")
.deploy(); //部署 //输出部署信息
System.out.println("流程名称:" + deployment.getName());
System.out.println("流程ID:" + deployment.getId());
System.out.println("流程Key:" + deployment.getKey());
} /**
* 启动一个流程实例
*/
@Test
public void getInstance() {
//获取ProcessEngine对象 默认配置文件名称:activiti.cfg.xml 并且configuration的Bean实例ID为processEngineConfiguration
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取RuntimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
//定义一个Map集合,存放assignee的值
Map<String, Object> assMap = new HashMap<>();
assMap.put("assignee01", "zhuyuan");
assMap.put("assignee02", "jingjie");
assMap.put("assignee03", "guangge");
assMap.put("assignee04", "chaoge");
//启动一个流程实例
ProcessInstance holiday = runtimeService.startProcessInstanceByKey("holiday", assMap);
System.out.println("流程启动成功~");
}
}
3、注意事项
由于使用了表达式分配,必须保证在任务执行过程表达式执行成功,比如:
某个任务使用了表达式${order.price > 100 && order.price < 250},当执行该任务时必须保证order 在流程变量中存在,否则activiti 异常。
四、监听器分配
任务监听器是发生对应的任务相关事件时执行自定义java 逻辑 或表达式。任务相当事件包括:
Create:任务创建后触发
Assignment:任务分配后触发
Delete:任务完成后触发
All:所有事件发生都触发
java 逻辑 或表达式:
表达式参考上边的介绍的UEL 表达式,这里主要介绍监听类使用。
定义任务监听类,且类必须实现org.activiti.engine.delegate.TaskListener 接口
package com.zn.listener; import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener; public class MyTaskListener implements TaskListener { @Override
public void notify(DelegateTask delegateTask) {
//这里执行任务负责人
delegateTask.setAssignee("zhuyuan");
}
}
注意事项:
使用监听器分配方式,按照监听事件去执行监听类的 notify 方法,方法如果不能正常执行也会影响任务的执行。
五、查询任务
查询任务负责人的代办任务;
package com.zn; import org.activiti.engine.*;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test; import java.util.HashMap;
import java.util.List;
import java.util.Map; public class ActivitiTest { /**
* 查看代办任务
*/
@Test
public void getTask(){
//获取ProcessEngine对象 默认配置文件名称:activiti.cfg.xml 并且configuration的Bean实例ID为processEngineConfiguration
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取一个TaskService对象
TaskService taskService=processEngine.getTaskService();
//查询代办业务 createTaskQuery查询任务 taskCandidateOrAssigned查询任务执行者 processDefinitionKey:查询流程
List<Task> list = taskService.createTaskQuery().taskAssignee("zhuyuan").processDefinitionKey("holiday").list();
for (Task task:list){
System.out.println("任务名称:"+task.getName());
System.out.println("任务执行人:"+task.getAssignee());
System.out.println("任务ID:"+task.getId());
System.out.println("流程实例ID:"+task.getProcessInstanceId());
}
} }
控制台效果:
六、关联 businessKey
需求:
在activiti 实际应用时,查询待办任务可能要显示出业务系统的一些相关信息,比如:查询待审批请假单任务列表需要将请假单的日期、请假天数等信息显示出来,请假天数等信息在业务系统中存在, 而并没有在activiti 数据库中存在,所以是无法通过activiti 的api 查询到请假天数等信息。
实现:
在查询待办任务时,通过 businessKey(业务标识 )关联查询业务系统的请假单表,查询出请假天数等信息。
七、办理任务
package com.zn; import org.activiti.engine.*;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test; import java.util.HashMap;
import java.util.List;
import java.util.Map; public class ActivitiTest {
/*任务处理
* `act_hi_identitylink` 历史参与者信息
* `act_hi_taskinst` 历史任务信息
* `act_ru_execution` 任务执行信息
* `act_ru_task` 任务信息
* 当所有任务处理完毕,对应当前流程实例信息删除,但是可以在历史中查看该信息
* */
@Test
public void completeTask(){
//获取ProcessEngine对象 默认配置文件名称:activiti.cfg.xml 并且configuration的Bean实例ID为processEngineConfiguration
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取一个TaskService对象
TaskService taskService = processEngine.getTaskService();
//任务处理
taskService.complete("2509");
} }
Activiti任务分配的更多相关文章
- Activiti学习笔记10 — 动态任务分配
动态任务分配使用的两种方式 一.通过特殊表达式,来获取任务信息 ,在流程 UserTask节点上设置 ${流程变量的Key} 1.流程定义 <?xml version="1.0&quo ...
- Activiti学习(二)数据表结构
Activiti工作流引擎数据库表结构 数据库表的命名 Acitiviti数据库中表的命名都是以ACT_开头的.第二部分是一个两个字符用例表的标识.此用例大体与服务API是匹配的. l ...
- activiti学习总结
Activiti界面元素的使用总结 一.图形设计中元素的使用 1.SequenceFlow:连接线,可以连接两个任务,来管理流程实例的流向 -----General -----id:流程的id,用与程 ...
- 工作流引擎Activiti使用总结
http://www.kafeitu.me/activiti/2012/03/22/workflow-activiti-action.html 1.简单介工作流引擎与Activiti 对于工作流引擎的 ...
- Activiti初学者教程
http://wenku.baidu.com/view/bb7364ad4693daef5ff73d32.html 1. 初识Activiti 1.1. 工作流与工作流引擎 工作流(workflow) ...
- Activiti工作流引擎使用
http://www.kafeitu.me/activiti/2012/03/22/workflow-activiti-action.html 1.简单介工作流引擎与Activiti 对于工作流引擎的 ...
- [转]activiti5用户任务分配
用户任务分配办理人:1.用户任务可以直接分配给一个用户,这可以通过humanPerformer元素定义. humanPerformer定义需要一个 resourceAssignmentExpressi ...
- Activiti工作流(二)之常用操作
前面介绍了Activiti工作流的基本操作,但是在实际应用过程中,往往不满足项目需求,因此还需要了解一些其他的功能比如:连线.排他网关.并行网管.流程变量.个人任务及组任务的三种发布方式. 下面将介绍 ...
- Activiti的全局事件机制及其监听处理
概述 Activiti在5.15以后的版本后,增加了统一的事件入口,不需要再像以前那样,监听流程的事件时,在流程定义的BPMN文件中为每个节点及流程增加以下的配置,以实现监听事件的做法,这种做法导致我 ...
随机推荐
- Keras深度神经网络算法模型构建【输入层、卷积层、池化层】
一.输入层 1.用途 构建深度神经网络输入层,确定输入数据的类型和样式. 2.应用代码 input_data = Input(name='the_input', shape=(1600, 200, 1 ...
- 第四章、深入理解vue组件
4-1.使用组件的细节 a.使用is解决html出现bug 如下 table下面应该为tr,所以页面渲染的时候没有找到tr是有问题的,所以是有小bug,所以table中必须是tr b.改上面bug,t ...
- linux 读取 USB HID鼠标坐标和点击 在 LCD上显示
首先要,编译内核时启用了 USB HID 设备.启用了 鼠标 . 在开发板上插入usb 时会有如下提示. 可以看到,多了一个 mouse0 和 eventX 打出来的是我的 联想鼠标. 1, 在 终端 ...
- pip 安装超时问题
pip install -i https://pypi.doubanio.com/simple/ 包名 参考: https://blog.csdn.net/qq_39161804/article/de ...
- CSS样式命名
CSS样式命名 说明网页公共命名#wrapper 页面外围控制整体布局宽度#container或#content 容器,用于最外层#layout 布局#head, #heade ...
- 通达OA rce复现
通达OA下载:链接:https://pan.baidu.com/s/1c0P-M-IyY5VxfH5d0qKHsQ 提取码:l0pc 漏洞原因:未授权文件上传 + 文件包含(利用nginx日志也可以g ...
- [转载] 全局键盘钩子(WH_KEYBOARD)
为了显示效果,在钩子的DLL中我们会获取挂钩函数的窗体句柄,这里的主程序窗体名为"TestMain",通过FindWindow查找. KeyBoardHook.dll代码 libr ...
- Selenium系列(七) - 切换iframe
如果你还想从头学起Selenium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1680176.html 其次,如果你不懂前端基础知识, ...
- NLP interview
2019-08-26 17:19:58 1)聊实习项目 2)代码题,二维数组中的查找某个target 3)讲一些最能体现创新能力的工作,而不是一些工程上的实现 4)讲论文可以从哪些方面做创新点,文本生 ...
- 动态规划-Minimum Cost to Merge Stones
2019-07-07 15:48:46 问题描述: 问题求解: 最初看到这个问题的时候第一反应就是这个题目和打破气球的题目很类似. 但是我尝试了使用dp将问题直接转为直接合并到一个堆问题复杂度迅速提高 ...