activiti學(xué)習(xí)筆記(八)TaskService

TaskService

  • 對(duì)用戶任務(wù)UserTask的管理和流程的控制
  • 設(shè)置用戶任務(wù)的權(quán)限信息(設(shè)置候選人等)
  • 針對(duì)用戶任務(wù)添加任務(wù)附件句占,任務(wù)評(píng)論和事件記錄

TaskService對(duì)Task的管理和控制

  • Task對(duì)象的創(chuàng)建和刪除
  • 查詢Task,驅(qū)動(dòng)Task節(jié)點(diǎn)完成執(zhí)行
  • Task相關(guān)參數(shù)變量variable設(shè)置

TaskService變量的作用域

// 查詢task
Task task1 = taskService.createTaskQuery().singleResult();
 // 設(shè)置全局變量
taskService.setVariable(task1.getId(),"key1","value1");
// 設(shè)置局部變量
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設(shè)置局部變量后,局部變量的作用域只限于當(dāng)前任務(wù)內(nèi)歉闰,如果任務(wù)結(jié)束后辖众,那么局部變量也就隨著消失了卓起。

除了直接設(shè)置變量外,在任務(wù)提交的時(shí)候也可以附帶變量凹炸,即使用taskService.complete(),這個(gè)complete方法多個(gè)重載方法:

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(對(duì)應(yīng)act_ru_task中的id_)戏阅,variables(下一次任務(wù)所需要的參數(shù)),作用是完成這一次任務(wù),并且下一步任務(wù)需要流程變量的啤它。要注意的是localScope這個(gè)參數(shù):localScope(存儲(chǔ)范圍:本任務(wù)) 奕筐。當(dāng)這個(gè)布爾值為true表示作用范圍為當(dāng)前任務(wù),當(dāng)任務(wù)結(jié)束后变骡,再也取不到這個(gè)值了离赫,act_ru_variables這個(gè)表中也沒(méi)有這個(gè)參數(shù)的信息了;如果為false表示這個(gè)變量是全局的塌碌,任務(wù)結(jié)束后在act_ru_variables表中仍然能查到變量信息渊胸。相關(guān)內(nèi)容可以查看下面這篇文章:
https://blog.csdn.net/u013026207/article/details/53405265

TaskService設(shè)置Task權(quán)限信息

  • 候選用戶candidateUser和候選組candidateGroup
  • 指定擁有人Owner和辦理人Assignee
  • 通過(guò)claim設(shè)置辦理人(簽收 )

示例:
首先編寫(xiě)流程文件如下:

<?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="二級(jí)審批" processType="None">
    <startEvent id="startEvent" name="開(kāi)始"/>
    <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>

其中設(shè)置了節(jié)點(diǎn)的候選人為yubuyun。
后臺(tái)代碼如下:

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");
}

上述代碼中先對(duì)任務(wù)進(jìn)行查詢台妆,查詢條件為候選人為yubuyun翎猛,并且還沒(méi)有被簽收,然后才對(duì)查詢結(jié)果進(jìn)行簽收接剩。這樣做的原因是切厘,如果某個(gè)task之前已經(jīng)被簽收claim了,再次執(zhí)行claim命令的時(shí)候就會(huì)拋出異常,記一個(gè)任務(wù)只能被簽收一次懊缺,為此防止拋出異常疫稿,可以先查詢?nèi)蝿?wù)是否被簽收。

OWNER 和 ASSIGNEE 的區(qū)別

在act_ru_task表中有OWNER_和ASSIGNEE_兩個(gè)字?jǐn)唷?br> 這兩個(gè)字段的意義是:
1鹃两,ASSIGNEE_(受理人):task任務(wù)的受理人遗座,就是執(zhí)行TASK的人,這個(gè)又分兩種情況(有值怔毛,NULL)

  • 有值的情況:XML流程里面定義的受理人员萍,TASK會(huì)直接填入這個(gè)人腾降;
  • NULL:XML沒(méi)有指定受理人或者只指定了候選組拣度;
    沒(méi)有值的時(shí)候,可以使用簽收功能去指定受理人螃壤,就是候選組里面誰(shuí)簽收誰(shuí)就成了受理人抗果。
  1. OWNER_(委托人):受理人委托其他人操作該TASK的時(shí)候,受理人就成了委托人OWNER_奸晴,其他人就成了受理人ASSIGNEE_
    owner字段就是用于受理人委托別人操作的時(shí)候運(yùn)用的字段冤馏。
Task task=taskService.createTaskQuery().singleResult();
//簽收
taskService.claim(task.getId(), "billy");
logger.info(taskService.createTaskQuery().singleResult().getAssignee());
//結(jié)果:billy

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

TaskService設(shè)置Task附加信息

  • 任務(wù)附件Attachment創(chuàng)建與查詢
  • 任務(wù)評(píng)論Comment創(chuàng)建與查詢
  • 事件記錄Event創(chuàng)建與查詢

添加附件示例

// 添加附件(地址位于/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);
}

最終打印結(jié)果是一個(gè)對(duì)象,說(shuō)明附件作為對(duì)象保存到數(shù)據(jù)庫(kù)中寄啼。

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

添加評(píng)論示例

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));
}

評(píng)論對(duì)象輸出為:

[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

事件記錄

事件記錄查詢?yōu)椋?/p>

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

輸出結(jié)果如下:

[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結(jié)果相同逮光,但是event除了相同部分外代箭,還有添加附件和添加用戶的事件記錄。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末涕刚,一起剝皮案震驚了整個(gè)濱河市嗡综,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌杜漠,老刑警劉巖极景,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異驾茴,居然都是意外死亡盼樟,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)锈至,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)晨缴,“玉大人,你說(shuō)我怎么就攤上這事峡捡∠才樱” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵棋返,是天一觀的道長(zhǎng)延都。 經(jīng)常有香客問(wèn)我,道長(zhǎng)睛竣,這世上最難降的妖魔是什么晰房? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮射沟,結(jié)果婚禮上殊者,老公的妹妹穿的比我還像新娘。我一直安慰自己验夯,他們只是感情好猖吴,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著挥转,像睡著了一般海蔽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上绑谣,一...
    開(kāi)封第一講書(shū)人閱讀 51,562評(píng)論 1 305
  • 那天党窜,我揣著相機(jī)與錄音,去河邊找鬼借宵。 笑死幌衣,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的壤玫。 我是一名探鬼主播豁护,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼哼凯,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了楚里?” 一聲冷哼從身側(cè)響起挡逼,我...
    開(kāi)封第一講書(shū)人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎腻豌,沒(méi)想到半個(gè)月后家坎,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吝梅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年虱疏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片苏携。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡做瞪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出右冻,到底是詐尸還是另有隱情装蓬,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布纱扭,位于F島的核電站牍帚,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏乳蛾。R本人自食惡果不足惜暗赶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望肃叶。 院中可真熱鬧蹂随,春花似錦、人聲如沸因惭。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蹦魔。三九已至激率,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間版姑,已是汗流浹背柱搜。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留剥险,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓宪肖,卻偏偏與公主長(zhǎng)得像表制,于是被迫代替她去往敵國(guó)和親健爬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,138評(píng)論 25 707
  • 一么介、Python簡(jiǎn)介和環(huán)境搭建以及pip的安裝 4課時(shí)實(shí)驗(yàn)課主要內(nèi)容 【Python簡(jiǎn)介】: Python 是一個(gè)...
    _小老虎_閱讀 5,746評(píng)論 0 10
  • 聽(tīng)村里的老人說(shuō)娜遵,這顆樹(shù)有百年了。 好奇心強(qiáng)烈的我壤短,在姐姐的帶領(lǐng)下设拟,來(lái)到這顆大樹(shù)下。
    蕭筱kristina閱讀 614評(píng)論 6 3
  • 繁星灑滿夜空 我們就是其中兩顆 沒(méi)有耀眼的光亮久脯,沒(méi)有華麗的神話 只是在偌大銀河中的平凡星辰 我們?cè)?jīng)迷失纳胧,我們?cè)?jīng)...
    一條狗罷了閱讀 253評(píng)論 1 1
  • 不久以前摧找,有一個(gè)新聞系剛畢業(yè)的同學(xué)問(wèn)我:做一個(gè)成功的新聞?dòng)浾咝枰邆涫裁礂l件核行?我的答覆只有六個(gè)字:謙虛、誠(chéng)懇蹬耘、勤奮...
    簡(jiǎn)書(shū)茶館葉老板閱讀 2,281評(píng)論 4 24