Activiti界面元素的使用總結
一、圖形設計中元素的使用
1、SequenceFlow:連接線,可以連接兩個任務,來管理流程實例的流向
-----General
-----id:流程的id,用與程序內部識別
-----name流程的名字,用於用戶顯示識別
-----Main config
-----Label width:組件的大小,自動
-----Condition:執行該流程的條件,可以通過#{}或${}結合流程變量來 實現
-----Listeners:通過類來控制流程的執行,該來要實現TaskListener接 口,並重寫notify()方法,把要傳入的參數傳進去。
2、UserTask:個人任務
----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:已經完成的實例個數
3、ExclusiveGateway:排他網關
根據不同的條件執行不同的流程分支(每次只能執行一個流程分支)
----General:(id,name和其他組件意義相同)
----Default flow:默認執行的流程分支,值為默認流程連接線的id
4、ParallelGateway:並行網關
可以同時執行多個流程分支
InclusiveGateway:包含網關
可以同時分支出多個流程分支(與並行網關一樣),和並行網關的區別就在於在分支流線上如果定義了條件,並行網關會忽略,而包含網關會進行相應的解析。
5、ReceiveTask:手動接收任務
執行到流程中的某個節點后就暫停執行,指定收到外部的信號后才會繼續執行
通過調用runtimeService.signal(executionId);方法,使流程繼續向下執行。
6、ScriptTask:腳本任務
可以執行一段腳本,可以在腳本中定義或修改變量,來控制流程的流轉。
腳本中添加的變量可以再整個流程中使用。execution.setVariable(“變量名”,變量值)
7、ServiceTask:java服務任務
會調用外部的java類
指定調用的class類的三種方式:
第一種中方法:
----Main config
-----Type:java class -----Service class:選擇外部實現了JavaDelegate或者ActivityBehavior 的java類;
第二種方法:
----Main config
----Type:Delegate expression
----Delegate expression:${“在spring中定義了的實現了JavaDelegate的bean”}
第三種方法
----Main config
----Type:Expression
----Expression:#{“在spring中配置的javabean的id.所調用的方法”}
在調用外部java類時,可以注入指段:(兩種方式)
方法一:直接注入
----Main config
----Field:new時指定Field name和String value
方法二:使用表達式注入
----Main config
----=Field:new時,指定File name和Expression()
表達式中查找的是流程變量或者Spring定義的bean
----Result variable:會把上面指定的java類的指定方法的返回值賦給該變量,該 變量可以是一個流程變量,或者spring的bean
8、Execution listeners和Task Listeners 執行監聽和任務監聽
在流程執行期間執行外部的java代碼
-----Event:start(事件開啟前調用),end(事件結束后調用)
Type和Field和上面的一樣
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 表示在2011年03 月12日 12:12:23觸發
---time cycle:循環規則:
R【循環次數】【/開始時間】/時間間隔【/結束時間】。
例:R3/PT10 表示重復3次,每次間隔10小時
從2004年5月6日北京時間下午1點起時間間隔半年零5天3小 時循環,且循環3次,可以表示為 R3/2004-05-06T130000+08/P0Y6M5DT3H0M0S。
以1年2個月為循環間隔,無限次循環,最后循環終止於2025年1 月1日,可表示為R/P1Y2M/2025-01-01
Cron 時間格式:seconds minutes hours day-of -mouth mouth,day-of-week year
其中*表示這個域上所有的合法值
例:0 * 17 * * ? 表示每天下午5點到5:59每分鍾觸發一次
?表示不指定該域上的值(只能用在日域或周域上,且不能同時在兩 個域上使用,即假如在在其中的一個域上指定了值,必要再另一 個上放?)
,表示在某個域上指定一個值列表
例: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秒觸發
L 表示某個域上允許的最后一個值(只能用在日域和周域上,用在 日域上時,表示當月的最后一天觸發;用在周域上,表示周的最 后一天,即周六觸發)
例:0 0 12 ? * 2L 表示每個月中的最后一個星期一的12:00觸發
W 表示里指定日期最近的工作日(只用在日域上,其只能指定單天, 不能指定范圍或列表)
例:在日域上指定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”);