這期內容當中小編將會給大家?guī)碛嘘PActiviti的知識點分析是什么,文章內容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
鹿邑網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)建站!從網(wǎng)頁設計、網(wǎng)站建設、微信開發(fā)、APP開發(fā)、成都響應式網(wǎng)站建設公司等網(wǎng)站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯(lián)建站從2013年成立到現(xiàn)在10年的時間,我們擁有了豐富的建站經驗和運維經驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設就選創(chuàng)新互聯(lián)建站。
查詢接口中的Xxx即為各種對象的查詢方式,如createProcessDefinitionQuery為查詢流程定義的方法。查詢最后的調用有如下通用方法:
asc:升序,和list配合使用
desc:倒序,和list配合使用
count:返回計數(shù)
list:返回一個list
listPage:返回分頁list
singleResult:返回單個對象
不同的查詢接口需要調用不同的服務組件,如repositoryService提供流程定義相關的查詢;identityService服務組件提供用戶、用戶組相關的查詢;runtimeService提供流程實例相關的查詢。
①常規(guī)查詢:如下查詢?yōu)槁暶髁艘粋€流程定義processDefinition來接受查詢返回的單個對象,流程定義需要調用repositoryService服務組件中的createProcessDefinition,根據(jù)部署的id獲取,流程定義的單個實體。
ProcessDefinition processDefinition=repositoryService.createProcessDefinitionQuery(). deploymentId(deployment.getId()).singleResult();
②自定義sql查詢:可以使用自定義sql去根據(jù)數(shù)據(jù)庫字段查詢數(shù)據(jù):
List<Group> groups=identityService.createNativeGroupQuery().sql("SELECT * FROM ACT_ID_GROUP where NAME=#{name}").parameter("name","group2");
流程定義部署使用DeploymenBuilder對象,該對象提供了以下方法來實現(xiàn)流程部署:
addClasspathResource
addInputStream
addString
addZipInputStream
addBpmnModel
addBytes
deploy
如我們正常部署一個bpmn文件定義的流程定義使用如下代碼:
DeploymentBuilder builder=repositoryService.createDeployment(); builder.addClasspathResource("test1.bpmn"); builder.deploy();
先使用DeploymenBuilder類來生命了一個builder對象,并通過repositoryService來創(chuàng)建部署,在之后使用builder的addClasspathResource方法將bpmn部署到數(shù)據(jù)庫中,在此過程中該方法不僅回將bpmn文件內容存入數(shù)據(jù)庫,也會根據(jù)bpmn生成對應的流程圖png文件以通存入數(shù)據(jù)庫。
流程定義部署完成后,還可以終止或激活流程定義,當終止流程定義時,該流程定義的流程實例不能再被啟動。
//終止流程定義 repositoryService.suspendProcessDefinitionByKey(ProcessDefinitionKey); //啟動流程定義 repositoryService.activateProcessDefinitionByKey(ProcessDefinitionKey);
任務候選人(組):表示該任務可以由某個用戶組(如經理)來完成。
任務持有人(owner):完成該任務時某個人的職責,那么這個人是此任務的持有人,一個任務只能由一個持有人。
任務代理人(assignee):由于本人不能及時處理任務,而委托給他人,這個人就是此任務代理人,一個任務只能由一個代理人。
對任務設置候選人,使用addCandidateUser將用戶設置為某個人物的候選人,并將這種綁定關系記錄到ACT_RU_IDENTITYLINK表中,代碼如下:
String taskId = UUID.randomUUID().toString(); //此處因為只是demo所以直接創(chuàng)建了一個task,正常情況下應該從流程實例中取出task Task task = ts.newTask(taskId); task.setName("測試任務"); ts.saveTask(task); // 創(chuàng)建用戶 String userId = UUID.randomUUID().toString(); User user = is.newUser(userId); user.setFirstName("angus"); is.saveUser(user); // 設置任務的候選用戶 ts.addCandidateUser(taskId, userId); //設置任務的持有用戶 ts.setOwner(taskId, userId); //設置任務的代理人,只能被聲明一次代理人,再次聲明會報錯 ts.claim(taskId, userId);
如何給任務設置參數(shù):
//簡單的任務參數(shù)保存在ACT_RU_VARIABLE表中 taskSevice.setVariable(task.id,"var1","hello"); //任務參數(shù)也可以保存一個對象,但是保存的對應類必須已經實現(xiàn)了serialize可序列話接口 //如果保存對象,數(shù)據(jù)即序列話后的對象將會額外保存到ACT_GE_BYTEARRAY taskSevice.setVariable(task.id,"person1",p); //取出存入的對象 Person p=taskSevice.getVariable(task.id,"person1",Person.class);
任務參數(shù)有著不同的作用域:
本地參數(shù)(setVariableLocal):當前節(jié)點完成后,參數(shù)就會失效。
全局參數(shù)(setVariable):一直有效。
除了使用java代碼set參數(shù)外,還可以在流程xml文件中保存參數(shù):
<dataObject id="personName" name="personName" itemSubjectRef="xsd:string"> <extensionElements> <activiti:value>Crazyit</activiti:value> </extensionElements> </dataObject>
獲取方法如下:
String var = taskService.getVariable(task.getId(), "personName", String.class);
流程實例(ProcessInstance)可以理解為我們根據(jù)流程定義(類)而創(chuàng)建的“對象”。
執(zhí)行流(Execution)簡單理解為工作流圖中的一條條線路,而流程實例繼承了執(zhí)行流,因此也被稱為著執(zhí)行流。
ProcessInstance可以直接使用runService的startProcessInstance方法開創(chuàng)建,創(chuàng)建成功后他的數(shù)據(jù)將會被保存在ACT_RU_EXECUTION表中,需要注意的是盡管流程圖如圖只有一根線路,數(shù)據(jù)庫中也會出現(xiàn)兩條數(shù)據(jù),一條為主執(zhí)行流,一條為子執(zhí)行流。
無論工作流圖是怎么樣的,都必定有一個主執(zhí)行流,而有多少個分支就會有多少個子執(zhí)行流。
startProcessInstance主要有三類分別是根據(jù)id、key和message消息來啟動,前兩個就是根據(jù)流程定義的id、key來啟動,最后一個消息是等待一個消息來創(chuàng)建流程實例。
一般流程前進使用trigger方法,使用流程的id傳參
Execution exe = runService.createExecutionQuery() .processInstanceId(pi.getId()).onlyChildExecutions() .singleResult(); System.out.println(pi.getId() + ", 當前節(jié)點:" + exe.getActivityId()); // 讓它往前走 runService.trigger(exe.getId()); exe = runService.createExecutionQuery() .processInstanceId(pi.getId()).onlyChildExecutions() .singleResult(); System.out.println(pi.getId() + ", 當前節(jié)點:" + exe.getActivityId());
信號事件:xml形式如下
<signal id="testSignal" name="testSignal"></signal> <process id="myProcess" name="My process" isExecutable="true"> ... <intermediateCatchEvent id="signalintermediatecatchevent1" name="SignalCatchEvent"> <signalEventDefinition signalRef="testSignal"></signalEventDefinition> </intermediateCatchEvent> ... </process>
它需要等待程序發(fā)出信號才能繼續(xù)運行,不然就會在原地等待。
runService.signalEventReceived("testSignal");
消息事件:xml中需要先設定message標簽,再在中間拋出事件中,創(chuàng)建消息事件定義,并使用messageRef屬性執(zhí)行message標簽。
<message id="testMsg" name="testMsg"></message> <process id="myProcess" name="My process" isExecutable="true"> ... <intermediateCatchEvent id="messageintermediatecatchevent1" name="MessageCatchEvent"> <messageEventDefinition messageRef="testMsg"></messageEventDefinition> </intermediateCatchEvent> ... </process>
相應的程序中也只需要發(fā)出相應消息即可工作流繼續(xù)向前進行
runService.messageEventReceived("testMsg", exe.getId());
區(qū)別:從信號和消息的方法參數(shù)就可以看出,信號的發(fā)送不需要制定特定的對象,而消息是需要制定流程的。簡單來說信號像是廣播,只要定義了該信號的人都會收到信號;而消息像私信只有收到消息的目標流程才會繼續(xù)前行。
異步任務產生的工作:下面的應用會使用到activiti引擎的異步執(zhí)行,因此需要在activiti.cfg.xml中進行如下配置,開啟異步執(zhí)行,如果不開啟此項配置,流程將會卡在ServiceTask不能繼續(xù)向前運行。
<property name="asyncExecutorActivate" value="true"></property>
之后創(chuàng)建bpmn工作流圖,以xml格式打開,更改他的servicetask組件屬性
<serviceTask id="servicetask1" name="Service Task" activiti:async="true" activiti:class="org.crazyit.act.c10.MyJavaDelegate"></serviceTask>
activti:class指向的是他要執(zhí)行的類(類需要實現(xiàn)JavaDelegate接口并且實現(xiàn)execute方法),而async屬性則是開啟異步執(zhí)行。
package org.crazyit.act.c10; import org.activiti.engine.delegate.DelegateExecution; import org.activiti.engine.delegate.JavaDelegate; public class MyJavaDelegate implements JavaDelegate { @Override public void execute(DelegateExecution arg0) { System.out.println("這是處理類"); } }
定時器任務:會等待定時結束在繼續(xù)執(zhí)行,如下:
<intermediateCatchEvent id="timerintermediatecatchevent1" name="TimerCatchEvent"> <timerEventDefinition> <timeDuration>PT1M</timeDuration> </timerEventDefinition> </intermediateCatchEvent>
被中斷的任務:被suspend中斷的任務會被寫入ACT_RU_SUSPENED表中,同理activate重新激活被中斷的任務,任務將會被從表中移除,恢復正常運行。
無法執(zhí)行的任務:加入一個任務三次拋出異常,就將會被加入ACT_RU_DEADLETTER表中。
上述就是小編為大家分享的Activiti的知識點分析是什么了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
網(wǎng)站題目:Activiti的知識點分析是什么
URL分享:http://jinyejixie.com/article40/posgho.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護、網(wǎng)站營銷、網(wǎng)站設計、云服務器、做網(wǎng)站、小程序開發(fā)
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)