activiti學習總結


Activiti界面元素的使用總結

一、圖形設計中元素的使用

1SequenceFlow:連接線,可以連接兩個任務,來管理流程實例的流向

-----General

-----id:流程的id,用與程序內部識別

-----name流程的名字,用於用戶顯示識別

-----Main config

-----Label width:組件的大小,自動

-----Condition:執行該流程的條件,可以通過#{}${}結合流程變量來 實現

-----Listeners:通過類來控制流程的執行,該來要實現TaskListener 口,並重寫notify()方法,把要傳入的參數傳進去。

2UserTask:個人任務

----General:當前任務

----id:用於程序內部標示當前任務

-----name:任務名稱:用於在視圖上顯示當前任務描述

----Main config

----Assignee:指定單個辦理人(有三種方法)

方法一:直接指定,輸入辦理人即可

方法二:通過流程變量指定辦理人(使用#{}${}獲取流程實例啟動 時,通過

.startProcessInstanceByKey(processDefinitionKey,variables)

流程變量傳入的值)

方法三:通過類來指定辦理人(在該屬性下不加任何指定,在Listeners 下指定相關的類,與連接線中的listeners相似)

delegateTask.setAssignee("指定辦理人"

----Candidate user(comma separated):指定組任務(三種方式)

方法一:直接指定,如:小a,b,c,d

可以在程序中通過

taskService.addCandidateUser("taskId","userId")添加組成員

.deleteCandidateUser("taskId","userId")刪除組成員

    .claim("taskId","userId");拾取任務,將組任務分配 給個人任務

.claim("taskId"null);將個人任務退回到組任務(之 前必須是組任務)

方法二:通過流程變量分配(同個人任務分配一樣)

如:variables.put("userIDs","大大,中中,小小");

方法三:通過類來分配(同個人任務分配一樣),只是在方法內部調 用的是:delegateTas.addCandidateUser()

或者.addCandidateUsers()方法

----Candidate groups(comma separated):指定組任務分配給角色

可以在流程發布時,設定相應的角色和用戶

添加角色:identityService.saveGroup(new GroupEntity(groupId));

添加用戶:identityService.saveUser(new UserEntity(userId))

添加兩者間的關系:

identityService.createMembership(userId,groupId)

----Form 

----Form key:表單id,用於程序內部識別(表單鏈接)

表單的三種方式:

方法一:(動態表單)

Form屬性中指定各個字段

方法二:(外置表單)

Main config屬性中的Form key字段中指定.form文件的路徑

方法三:(普通表單)

Main config屬性中的Form key字段中指定存放表單的頁面 (jsp,html,jsf)

----Listeners:

----Task listeners:任務監聽,在流程啟動時,把流程變量,通過TaskListener 口的實現類中的notify方式添加進去

----event :

-----create:創建任務,並設置所有屬性后觸發

----assignment:任務分配給辦理人時觸發,在create事件之前

----complete:任務完成,且尚未從數據庫中刪除時觸發

----delete:只在任務刪除之前觸發。(正常完成時也會觸發)

 

----Execution listeners:執行監聽器,在任務執行時,調用ExecutionListener 口的實現類中的notify方法

----event:對於連續:只能是take(因為連續只能觸發take事件,默認該屬 性會被忽略)

對於其他組件:(start end

----start:事件開始前調用

----end:事件結束后調用

----Multi instance:

----Sequential:

-----yes:串行(多個人要按照list集合中的順序依次完成任務)

----no:並行(多個人是同級關系,沒有先后,可以同時完成各自的 任務)

----Loop  cardinality:產生的實例個數(不能超過list集合的元素個數)

----Collection:#{users}接收任務的人員列表,可以在啟動流程實例時進行初 始化流程變量users

例:String [] users={“大大”,”中中”,”小小”};

Map<String,Object> variables=new HashMap<String,Object>();

Variables.put(“users”,Arrays.asList(users));

.startProcessInstanceByKey(processDefintionKey,variables);

----Element variable:辦理人的環境變量

例:如果在assignment:中指定為#{user},則該項應為user

----Completion condition:完成條件

可以根據以下三個變量進行設置

nrOfInstances:實例總數

nrOfActiveInstances:當前還沒有完成的實例

nrOfCompleteInstances:已經完成的實例個數

3ExclusiveGateway:排他網關

根據不同的條件執行不同的流程分支(每次只能執行一個流程分支)

----General:(idname和其他組件意義相同)

----Default flow:默認執行的流程分支,值為默認流程連接線的id

4ParallelGateway:並行網關

可以同時執行多個流程分支

   InclusiveGateway:包含網關

可以同時分支出多個流程分支(與並行網關一樣),和並行網關的區別就在於在分支流線上如果定義了條件,並行網關會忽略,而包含網關會進行相應的解析。

5ReceiveTask:手動接收任務

執行到流程中的某個節點后就暫停執行,指定收到外部的信號后才會繼續執行

通過調用runtimeService.signal(executionId);方法,使流程繼續向下執行。

6ScriptTask:腳本任務

可以執行一段腳本,可以在腳本中定義或修改變量,來控制流程的流轉。

腳本中添加的變量可以再整個流程中使用。execution.setVariable(“變量名”,變量值)

7ServiceTask:java服務任務

會調用外部的java

指定調用的class類的三種方式:

第一種中方法:

----Main config

-----Type:java class -----Service class:選擇外部實現了JavaDelegate或者ActivityBehaviorjava類;

第二種方法:

----Main config

----Type:Delegate expression

----Delegate expression:${“在spring中定義了的實現了JavaDelegatebean”}

第三種方法

----Main config

----Type:Expression

----Expression:#{“在spring中配置的javabeanid.所調用的方法”}

在調用外部java類時,可以注入指段:(兩種方式)

方法一:直接注入

----Main config

----Field:new時指定Field nameString value

方法二:使用表達式注入

----Main config

----=Field:new時,指定File nameExpression()

表達式中查找的是流程變量或者Spring定義的bean

----Result variable:會把上面指定的java類的指定方法的返回值賦給該變量,該 變量可以是一個流程變量,或者springbean

8、Execution listenersTask Listeners    執行監聽和任務監聽

在流程執行期間執行外部的java代碼

-----Event:start(事件開啟前調用),end(事件結束后調用)

TypeField和上面的一樣

9、Email Task郵件任務:(需要在activiti.cfg.xml中配置郵件服務器)

----Mian config

----To:接受者

----From:發送者

----Subject:主題

----Cc:抄送

----Bcc:暗送

----Charset:字符集

----Html text:郵件內容

10、CallActiviti:調用外部其他流程

當流程運行的此時,啟動新的流程實例

----General:

----Default flow:默認流程的流轉

----Main config

----Called Element:被調用的流程的.bpmn文件中的id

11、SubProcess:調用子流程(可以在SubProcess中配置新的流程,當流程運行到這里時會知 道啟動子流程)

----id,name和上面的一樣

12、timer:定時器(Main config中的數據格式均為:)

必選在activiti的配置文件中配置:<property name="jobExecutorActivate"  value="true" />,否則定時任務無法正常啟動。

Main config中的數據格式均為:ISO_8601格式:(P ,Y,M,W,D,T,.H,M,S)或 cron時間格式:

Iso_8601格式:

-----Time duration:延時多長時間后觸發。例:P10D 表示10天以后觸發

-----time date:什么時間觸發。例:2011-03-12T12:12:23 表示在20110312日 12:12:23觸發

      ---time cycle:循環規則:

R【循環次數】【/開始時間】/時間間隔【/結束時間】

例:R3/PT10 表示重復3次,每次間隔10小時

  從200456日北京時間下午1點起時間間隔半年零53 時循環,且循環3次,可以表示為             R3/2004-05-06T130000+08/P0Y6M5DT3H0M0S

12個月為循環間隔,無限次循環,最后循環終止於20251    1日,可表示為R/P1Y2M/2025-01-01

 

Cron 時間格式:seconds minutes hours day-of -mouth mouth,day-of-week year

其中*表示這個域上所有的合法值

例:0 * 17 * * ? 表示每天下午5點到559每分鍾觸發一次

?表示不指定該域上的值(只能用在日域或周域上,且不能同時在兩 個域上使用,即假如在在其中的一個域上指定了值,必要再另一 個上放?)

,表示在某個域上指定一個值列表

例:0 10,44 14 ? 3 WEB  表示三月中每個星期三的下午2:10 和下午的2:44觸發

表示在某個域上指定一個值范圍

例:0 45 3-8 ? * * 表示上午3點到上午8點的45分時觸發

m/n 表示某個域的值從m開始,按n遞增

例:0/15 0/30 * * * ? 表示整點和半點時每15秒觸發

表示某個域上允許的最后一個值(只能用在日域和周域上,用在 日域上時,表示當月的最后一天觸發;用在周域上,表示周的最 后一天,即周六觸發)

例:0 0 12 ? * 2L 表示每個月中的最后一個星期一的12:00觸發

表示里指定日期最近的工作日(只用在日域上,其只能指定單天, 不能指定范圍或列表)

例:在日域上指定15W,那么如果15號是工作日,就在15 觸發

如果15號是周六,就在14號觸發

如果15號是周日,就在16號觸發

表示月份中的第幾周的哪一天(只用在周域上)

例:6#3 表示某個月的第三個星期五

 

二、開發流程

1、配置activiti.cfg.xml文件,里面可以配置要訪問的數據庫

<bean id=”processEngineConfiguration” 

class=”org.activiti.engine.impl.cfg.StandaloneInMemprocessEngineConfiguration>

<property name=”databaseType” value=”mysql”/>

<property name=”jdbcUrl” value=”jdbc:mysql://localhost:3306/activiti”/> ......

<!--在進行過去流程引擎時會自動生成工作流需要的28張表-->

<property name=”databaseSchemaUpdate” value=”true”/>

</bean>

2、獲取流程引擎(默認會按照類路徑下的activiti.cfg.xml文件生成)

ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine();

 

3、部署流程定義

方法一:(從classpath下部署)

Deployment deployment=processEngine.getRepositoryService()

.createDeployment()

.name(“流程名稱”)

.addClasspathResource(“diagrams/helloword.bpmn”)

.addClasspathResource(“diagrams/helloword.png”)

.deploy();

方法二:(從zip文件部署)

//.bpmn.png文件壓縮到helloword.zip文件中

InputStream inputStream=this.getClass().getClaassLoader().

getResourceAsStream(“diagrams/helloword.zip”);

Deployment deployment=processEngine.getRepositoryService()

.createDeployment()

.name(“流程名稱”)

.addZipInputStream(new ZipInputStream(inputStream))

.deploy();

方法三:(從當前路徑下獲取)

要在Build Pah-->configura Build Path--->Source---->某個包下的Included雙擊

--->Inclusion pathterns下清空,則會把該包下的所有文件進行編譯

InpuStream inputStreamBpmn=this.getClass().

getResourceAsStream(“sequenceFlow.bpmn”);//從當前路徑下獲取

InpuStream inputStreamBpmn=this.getClass().

getResourceAsStream(“/sequenceFlow.bpmn”);//從類路徑下獲取

Deployment deployment=processEngine.getRepositoryService()

.createDeployment()

.name(“流程名稱”)

.addInputStream(“sequenceFlow.bpmn”,inputStreamBpmn)

.addInputStream(“sequenceFlow.png”,inputStreamPng)

.deploy();

4、啟動流程實例

ProcesssInstance processInstance=processEngine.getRuntiomService()

.startProcessInstanceByKey(“.bpmn文件中流程的id屬性的值”)

5、任務查詢

(1)個人任務查詢(只有任務的Main config中的Assignee中指定了辦理人才代 表個人任務,才可通過個人任務進行查詢)

List<Task> list=processEngine.getTaskService()

.createTaskQuery()

.taskAssignee(“辦理人”)//指定辦理人

.list();

(2)查詢組任務

List<Task> list=processEngine.getTaskService()

.createTaskQuery()

.taskCandidateUser(“組成員或者擁有角色的用戶”)

.list();

a.如果是通過組任務的方式進行的任務分配,即在Mian config中的 Candidate Users中通過逗號分隔指定的一組辦理人

b.如果是通過角色的方式進行的任務分配即在Main config中的

  Candidate groups中指定任務的辦理角色

6、完成任務

processEngine.getTaskService().complete(“任務id”);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM