activiti学习笔记(八)TaskService

TaskService

  • 对用户任务UserTask的管理和流程的控制
  • 设置用户任务的权限信息(设置候选人等)
  • 针对用户任务添加任务附件,任务评论和事件记录

TaskService对Task的管理和控制

  • Task对象的创建和删除
  • 查询Task,驱动Task节点完成执行
  • Task相关参数变量variable设置

TaskService变量的作用域

// 查询task
Task task1 = taskService.createTaskQuery().singleResult();
 // 设置全局变量
taskService.setVariable(task1.getId(),"key1","value1");
// 设置局部变量
taskService.setVariableLocal(task1.getId(),"key2","value2");

// 获取全局变量
Map<String,Object> a = taskService.getVariables(task1.getId());
// 获取局部变量
Map<String,Object> b = taskService.getVariablesLocal(task1.getId());
// 获取全局变量
Map<String,Object> c = runtimeService.getVariables(processInstance.getId());

使用taskService设置局部变量后,局部变量的作用域只限于当前任务内,如果任务结束后,那么局部变量也就随着消失了。

除了直接设置变量外,在任务提交的时候也可以附带变量,即使用taskService.complete(),这个complete方法多个重载方法:

public void complete(String taskId);
public void complete(String taskId, Map<String, Object> variables);
public void complete(String taskId, Map<String, Object> variables, boolean localScope) ;

其中:taskId(对应act_ru_task中的id_),variables(下一次任务所需要的参数),作用是完成这一次任务,并且下一步任务需要流程变量的。要注意的是localScope这个参数:localScope(存储范围:本任务) 。当这个布尔值为true表示作用范围为当前任务,当任务结束后,再也取不到这个值了,act_ru_variables这个表中也没有这个参数的信息了;如果为false表示这个变量是全局的,任务结束后在act_ru_variables表中仍然能查到变量信息。相关内容可以查看下面这篇文章:
https://blog.csdn.net/u013026207/article/details/53405265

TaskService设置Task权限信息

  • 候选用户candidateUser和候选组candidateGroup
  • 指定拥有人Owner和办理人Assignee
  • 通过claim设置办理人(签收 )

示例:
首先编写流程文件如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" xmlns:tns="http://www.activiti.org/test" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" expressionLanguage="http://www.w3.org/1999/XPath" id="m1536107421286" name="" targetNamespace="http://www.activiti.org/test" typeLanguage="http://www.w3.org/2001/XMLSchema">
  <process id="second_approve" isClosed="false" isExecutable="true" name="二级审批" processType="None">
    <startEvent id="startEvent" name="开始"/>
    <sequenceFlow id="flow1" sourceRef="startEvent" targetRef="myTask"/>
    <userTask id="myTask" name="my-task" activiti:candidateUsers="yubuyun">
    </userTask>
    <sequenceFlow id="flow2" sourceRef="myTask" targetRef="endEvent"/>
    <endEvent id="endEvent" name="取消"/>
  </process>
</definitions>

其中设置了节点的候选人为yubuyun。
后台代码如下:

TaskService taskService = processEngine.getTaskService();
List<Task> taskList = taskService.createTaskQuery()
                .taskCandidateUser("yubuyun")
                .taskUnassigned()
                .listPage(0,100);
logger.info("taskList={}",taskList);
for(Task task : taskList){
     taskService.claim(task.getId(),"yubuyun");
}

上述代码中先对任务进行查询,查询条件为候选人为yubuyun,并且还没有被签收,然后才对查询结果进行签收。这样做的原因是,如果某个task之前已经被签收claim了,再次执行claim命令的时候就会抛出异常,记一个任务只能被签收一次,为此防止抛出异常,可以先查询任务是否被签收。

OWNER 和 ASSIGNEE 的区别

在act_ru_task表中有OWNER_和ASSIGNEE_两个字断。
这两个字段的意义是:
1,ASSIGNEE_(受理人):task任务的受理人,就是执行TASK的人,这个又分两种情况(有值,NULL)

  • 有值的情况:XML流程里面定义的受理人,TASK会直接填入这个人;
  • NULL:XML没有指定受理人或者只指定了候选组;
    没有值的时候,可以使用签收功能去指定受理人,就是候选组里面谁签收谁就成了受理人。
  1. OWNER_(委托人):受理人委托其他人操作该TASK的时候,受理人就成了委托人OWNER_,其他人就成了受理人ASSIGNEE_
    owner字段就是用于受理人委托别人操作的时候运用的字段。
Task task=taskService.createTaskQuery().singleResult();
//签收
taskService.claim(task.getId(), "billy");
logger.info(taskService.createTaskQuery().singleResult().getAssignee());
//结果:billy

//委托
taskService.delegateTask(task.getId(), "cc");
logger.info(taskService.createTaskQuery().singleResult().getOwner());
logger.info(taskService.createTaskQuery().singleResult().getAssignee());
//结果:owner是Billy,assignee是cc

TaskService设置Task附加信息

  • 任务附件Attachment创建与查询
  • 任务评论Comment创建与查询
  • 事件记录Event创建与查询

添加附件示例

// 添加附件(地址位于/url/test.png)到task中
taskService.createAttachment("url",task.getId(),
          processInstance.getId(),
           "name",
           "desc",
          "/url/test.png");

// 查询附件
List<Attachment> attachmentList = taskService.getTaskAttachments(task.getId());
for(Attachment attachment : attachmentList){
       logger.info("attach={}",attachment);
}

最终打印结果是一个对象,说明附件作为对象保存到数据库中。

attach=org.activiti.engine.impl.persistence.entity.AttachmentEntityImpl@680d4a6a

添加评论示例

taskService.addComment(task.getId(),processInstance.getId(),"record note 1");
taskService.addComment(task.getId(),processInstance.getId(),"record note 2");

List<Comment> commentList = taskService.getTaskComments(task.getId());
for(Comment comment : commentList){
    logger.info("comment={}", ToStringBuilder.reflectionToString(comment, ToStringStyle.MULTI_LINE_STYLE));
}

评论对象输出为:

[main] INFO com.activiti.HelloWorld - comment=comment,<null>,Tue Oct 02 22:49:53 CST 2018,105008,105004,AddComment,record note 2,record note 2,105016,false,false,false
[main] INFO com.activiti.HelloWorld - comment=comment,<null>,Tue Oct 02 22:49:53 CST 2018,105008,105004,AddComment,record note 1,record note 1,105015,false,false,false

事件记录

事件记录查询为:

List<Event> eventList = taskService.getTaskEvents(task.getId());
for(Event event : eventList){
     logger.info("event={}",ToStringBuilder.reflectionToString(event,ToStringStyle.SIMPLE_STYLE));
}

输出结果如下:

[main] INFO com.activiti.HelloWorld - comment=comment,<null>,Tue Oct 02 22:52:35 CST 2018,107508,107504,AddComment,record note 2,record note 2,107516,false,false,false
[main] INFO com.activiti.HelloWorld - comment=comment,<null>,Tue Oct 02 22:52:35 CST 2018,107508,107504,AddComment,record note 1,record note 1,107515,false,false,false
[main] INFO com.activiti.HelloWorld - event=comment,<null>,Tue Oct 02 22:52:35 CST 2018,107508,107504,AddComment,record note 2,record note 2,107516,false,false,false
[main] INFO com.activiti.HelloWorld - event=comment,<null>,Tue Oct 02 22:52:35 CST 2018,107508,107504,AddComment,record note 1,record note 1,107515,false,false,false
[main] INFO com.activiti.HelloWorld - event=event,<null>,Tue Oct 02 22:52:35 CST 2018,107508,107504,AddAttachment,name,<null>,107514,false,false,false
[main] INFO com.activiti.HelloWorld - event=event,<null>,Tue Oct 02 22:52:35 CST 2018,107508,<null>,AddUserLink,lizongyu_|_owner,<null>,107512,false,false,false

从日志可以看出comment和event结果相同,但是event除了相同部分外,还有添加附件和添加用户的事件记录。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,428评论 25 707
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,719评论 0 10
  • 听村里的老人说,这颗树有百年了。 好奇心强烈的我,在姐姐的带领下,来到这颗大树下。
    萧筱kristina阅读 577评论 6 3
  • 繁星洒满夜空 我们就是其中两颗 没有耀眼的光亮,没有华丽的神话 只是在偌大银河中的平凡星辰 我们曾经迷失,我们曾经...
    一条狗罢了阅读 249评论 1 1
  • 不久以前,有一个新闻系刚毕业的同学问我:做一个成功的新闻记者需要具备什么条件?我的答覆只有六个字:谦虚、诚恳、勤奋...
    简书茶馆叶老板阅读 2,271评论 4 24