Activiti學習(四)——API

1.查詢接口createXxxQuery

查詢接口中的Xxx即爲各類對象的查詢方式,如createProcessDefinitionQuery爲查詢流程定義的方法。查詢最後的調用有以下通用方法:javascript

  • asc:升序,和list配合使用
  • desc:倒序,和list配合使用
  • count:返回計數
  • list:返回一個list
  • listPage:返回分頁list
  • singleResult:返回單個對象

不一樣的查詢接口須要調用不一樣的服務組件,如repositoryService提供流程定義相關的查詢;identityService服務組件提供用戶、用戶組相關的查詢;runtimeService提供流程實例相關的查詢。java

①常規查詢:以下查詢爲聲明瞭一個流程定義processDefinition來接受查詢返回的單個對象,流程定義須要調用repositoryService服務組件中的createProcessDefinition,根據部署的id獲取,流程定義的單個實體。sql

ProcessDefinition processDefinition=repositoryService.createProcessDefinitionQuery().
                deploymentId(deployment.getId()).singleResult();

②自定義sql查詢:可使用自定義sql去根據數據庫字段查詢數據:數據庫

List<Group> groups=identityService.createNativeGroupQuery().sql("SELECT * FROM ACT_ID_GROUP where NAME=#{name}").parameter("name","group2");

2.流程文件部署

流程定義部署使用DeploymenBuilder對象,該對象提供瞭如下方法來實現流程部署:dom

  • addClasspathResource
  • addInputStream
  • addString
  • addZipInputStream
  • addBpmnModel
  • addBytes
  • deploy

如咱們正常部署一個bpmn文件定義的流程定義使用以下代碼:異步

DeploymentBuilder builder=repositoryService.createDeployment();
builder.addClasspathResource("test1.bpmn");
builder.deploy();

先使用DeploymenBuilder類來生命了一個builder對象,並經過repositoryService來建立部署,在以後使用builder的addClasspathResource方法將bpmn部署到數據庫中,在此過程當中該方法不只回將bpmn文件內容存入數據庫,也會根據bpmn生成對應的流程圖png文件以通存入數據庫。async

流程定義部署完成後,還能夠終止或激活流程定義,當終止流程定義時,該流程定義的流程實例不能再被啓動。ide

//終止流程定義
repositoryService.suspendProcessDefinitionByKey(ProcessDefinitionKey);
//啓動流程定義
repositoryService.activateProcessDefinitionByKey(ProcessDefinitionKey);

3.任務操做

任務候選人(組):表示該任務能夠由某個用戶組(如經理)來完成。測試

任務持有人(owner):完成該任務時某我的的職責,那麼這我的是此任務的持有人,一個任務只能由一個持有人。ui

任務代理人(assignee):因爲本人不能及時處理任務,而委託給他人,這我的就是此任務代理人,一個任務只能由一個代理人。

對任務設置候選人,使用addCandidateUser將用戶設置爲某我的物的候選人,並將這種綁定關係記錄到ACT_RU_IDENTITYLINK表中,代碼以下:

String taskId = UUID.randomUUID().toString();
//此處由於只是demo因此直接建立了一個task,正常狀況下應該從流程實例中取出task
Task task = ts.newTask(taskId);
task.setName("測試任務");
ts.saveTask(task);
//  建立用戶
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);

4.任務參數與附件

如何給任務設置參數:

//簡單的任務參數保存在ACT_RU_VARIABLE表中
taskSevice.setVariable(task.id,"var1","hello");

//任務參數也能夠保存一個對象,可是保存的對應類必須已經實現了serialize可序列話接口
//若是保存對象,數據即序列話後的對象將會額外保存到ACT_GE_BYTEARRAY
taskSevice.setVariable(task.id,"person1",p);
//取出存入的對象
Person p=taskSevice.getVariable(task.id,"person1",Person.class);

任務參數有着不一樣的做用域:

  • 本地參數(setVariableLocal):當前節點完成後,參數就會失效。
  • 全局參數(setVariable):一直有效。

除了使用java代碼set參數外,還能夠在流程xml文件中保存參數:

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

5.啓動流程實例

流程實例(ProcessInstance)能夠理解爲咱們根據流程定義(類)而建立的「對象」。

執行流(Execution)簡單理解爲工做流圖中的一條條線路,而流程實例繼承了執行流,所以也被稱爲著執行流。

ProcessInstance能夠直接使用runService的startProcessInstance方法開建立,建立成功後他的數據將會被保存在ACT_RU_EXECUTION表中,須要注意的是儘管流程圖如圖只有一根線路,數據庫中也會出現兩條數據,一條爲主執行流,一條爲子執行流。

不管工做流圖是怎麼樣的,都一定有一個主執行流,而有多少個分支就會有多少個子執行流。

startProcessInstance主要有三類分別是根據id、key和message消息來啓動,前兩個就是根據流程定義的id、key來啓動,最後一個消息是等待一個消息來建立流程實例。

6.流程實例的運行

通常流程前進使用trigger方法,使用流程的id傳參

Execution exe = runService.createExecutionQuery()
                .processInstanceId(pi.getId()).onlyChildExecutions()
                .singleResult();

        System.out.println(pi.getId() + ", 當前節點:" + exe.getActivityId());
        
        // 讓它往前走
        runService.trigger(exe.getId());
        
        exe = runService.createExecutionQuery()
                .processInstanceId(pi.getId()).onlyChildExecutions()
                .singleResult();
        System.out.println(pi.getId() + ", 當前節點:" + 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>

它須要等待程序發出信號才能繼續運行,否則就會在原地等待。

runService.signalEventReceived("testSignal");

消息事件:xml中須要先設定message標籤,再在中間拋出事件中,建立消息事件定義,並使用messageRef屬性執行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>

相應的程序中也只須要發出相應消息便可工做流繼續向前進行

runService.messageEventReceived("testMsg", exe.getId());

區別:從信號和消息的方法參數就能夠看出,信號的發送不須要制定特定的對象,而消息是須要制定流程的。簡單來講信號像是廣播,只要定義了該信號的人都會收到信號;而消息像私信只有收到消息的目標流程纔會繼續前行。

7.工做的產生和管理

異步任務產生的工做:下面的應用會使用到activiti引擎的異步執行,所以須要在activiti.cfg.xml中進行以下配置,開啓異步執行,若是不開啓此項配置,流程將會卡在ServiceTask不能繼續向前運行。

<property name="asyncExecutorActivate" value="true"></property>

以後建立bpmn工做流圖,以xml格式打開,更改他的servicetask組件屬性

<serviceTask id="servicetask1" name="Service Task" activiti:async="true" 
activiti:class="org.crazyit.act.c10.MyJavaDelegate"></serviceTask>

activti:class指向的是他要執行的類(類須要實現JavaDelegate接口而且實現execute方法),而async屬性則是開啓異步執行。

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("這是處理類");
    }
}

 定時器任務:會等待定時結束在繼續執行,以下:

<intermediateCatchEvent id="timerintermediatecatchevent1"
            name="TimerCatchEvent">
            <timerEventDefinition>
                <timeDuration>PT1M</timeDuration>
            </timerEventDefinition>
        </intermediateCatchEvent>

被中斷的任務:被suspend中斷的任務會被寫入ACT_RU_SUSPENED表中,同理activate從新激活被中斷的任務,任務將會被從表中移除,恢復正常運行。

沒法執行的任務:加入一個任務三次拋出異常,就將會被加入ACT_RU_DEADLETTER表中。

相關文章
相關標籤/搜索