Activiti6快速入门指南
Activiti6快速入門(mén)指南
這個(gè)快速入門(mén)假定:
- 熟悉Maven和Java
- 使用Java的開(kāi)發(fā)環(huán)境
本教程將引用以下變量
變量 | 描述 |
$mvnProject | maven項(xiàng)目的根位置 |
$actUnzipedPack | 從http://www.activiti.org/download.html下載的解壓縮文件的根位置。 |
$quickStartJavaProjectName | Quick Start Java Project的名稱(chēng)。建議將其作為“ActivitiDeveloperQuickStart”。 |
... | 為簡(jiǎn)潔起見(jiàn),請(qǐng)參閱跳過(guò)的信息。 |
$actVer | Activiti的版本目前正在運(yùn)行。 |
1.簡(jiǎn)介
?
本快速入門(mén)顯示了使用Activiti將業(yè)務(wù)流程管理(BPM)嵌入到您的應(yīng)用程序中的簡(jiǎn)單性。您將構(gòu)建一個(gè)命令行應(yīng)用程序,將基于標(biāo)準(zhǔn)的業(yè)務(wù)流程建模表示法(BPMN)邏輯嵌入到您的應(yīng)用程序中。
Activiti擁有先進(jìn)的流程設(shè)計(jì)工具,可將更復(fù)雜的BPM邏輯嵌入到您的應(yīng)用程序中。這些工具包括基于Eclipse和基于Web的BPMN編輯器,僅舉幾例。為簡(jiǎn)潔起見(jiàn),本快速入門(mén)僅使用Activiti的Java API。
有關(guān)其他Activiti BPM工具的介紹,請(qǐng)參閱:
- 樣品入門(mén)快速入門(mén)
- Activiti用戶指南
本快速入門(mén)
- 一般來(lái)說(shuō),遠(yuǎn)離特定于IDE的插圖(盡管它們是謹(jǐn)慎地完成的)。Activiti適用于任何Java友好的IDE。
- 使用Maven,但Gradle和Ivy等其他構(gòu)建和依賴管理系統(tǒng)也可以工作。
2.創(chuàng)建和設(shè)置Maven項(xiàng)目
$quickStartJavaProjectName使用以下Maven依賴項(xiàng)創(chuàng)建名為“ActivitiDeveloperQuickStart”(以下稱(chēng)為)的Java項(xiàng)目:
文件:$ mvnProject /pom.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd">
? <modelVersion>4.0.0</modelVersion>
? <groupId>$quickStartJavaProjectName</groupId>
? <artifactId>$quickStartJavaProjectName</artifactId>
? <version>0.0.1-SNAPSHOT</version>
?
? <!--?... other configurations mayexist, such as a build stanza, depending your environment ... -->
?
? <dependencies>
??? <dependency>
????? <groupId>org.activiti</groupId>
????? <artifactId>activiti-engine</artifactId>
????? <version>$actVer</version>
??? </dependency>
??? <dependency>
????? <groupId>org.slf4j</groupId>
????? <artifactId>slf4j-api</artifactId>
????? <version>1.7.21</version>
??? </dependency>
??? <dependency>
????? <groupId>org.slf4j</groupId>
????? <artifactId>slf4j-log4j12</artifactId>
????? <version>1.7.21</version>
??? </dependency>
??? <dependency>
????? <groupId>com.h2database</groupId>
????? <artifactId>h2</artifactId>
????? <version>1.4.193</version>
? ??</dependency>
? </dependencies>
</project>
?
當(dāng)然,$actVer將替換為下載的Activiti版本。例如,如果您下載的Activiti軟件包是“activiti-6.0.0”,那么它的值$actVer將是6.0.0。
請(qǐng)注意以下依賴項(xiàng):
- Activiti(org.activiti) - Activiti的BPM引擎
- 數(shù)據(jù)庫(kù)(com.h2database) - H2數(shù)據(jù)庫(kù)
- 記錄(org.slf4j) - Java的簡(jiǎn)單日志外觀
在引用構(gòu)建目錄時(shí),本教程假定您的maven項(xiàng)目的標(biāo)準(zhǔn)Maven構(gòu)建路徑:
路徑 | 描述 |
$mvnProject/ SRC /主/ JAVA | Java源目錄 |
$mvnProject/ src目錄/主/資源 | 資源目錄 |
$mvnProject/ SRC /測(cè)試/ JAVA | Java測(cè)試目錄 |
$mvnProject/ SRC /測(cè)試/資源 | 資源測(cè)試目錄 |
?
您應(yīng)該能夠構(gòu)建空白項(xiàng)目。在繼續(xù)之前,請(qǐng)確保整體狀態(tài)為“BUILD SUCCESS”。
命令:mvn compile
基本路徑:$ mvnProject
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[INFO] Scanning for projects...
[INFO]? ? ? ?? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ?
[INFO]------------------------------------------------------------------------
[INFO] Building $quickStartJavaProjectName0.0.1-SNAPSHOT
[INFO]------------------------------------------------------------------------
[INFO]?
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ $quickStartJavaProjectName ---
[WARNING] Using platform encoding(UTF-8 actually) to copyfiltered resources, i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO]?
[INFO] --- maven-compiler-plugin:3.5.1:compile (default-compile) @HelloProcess2 ---
[INFO] Nothing to compile - allclasses are up to date
[INFO]------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO]------------------------------------------------------------------------
[INFO] Total time: 0.592s
[INFO] Finished at: Sun Nov 2705:09:59 EST 2016
[INFO] Final Memory: 10M/309M
[INFO]------------------------------------------------------------------------
?
?筆記:
- 您的輸出可能看起來(lái)不同。最值得注意的是,maven可能需要檢索項(xiàng)目依賴項(xiàng)。
3.創(chuàng)建流程引擎
?
正如之前在maven依賴關(guān)系摘要中所建議的那樣,Activiti利用Simple Logging Facade for Java(slf4j)進(jìn)行日志記錄。在此示例應(yīng)用程序中,我們將使用log4j日志記錄實(shí)現(xiàn)。將log4j.properties文件添加到項(xiàng)目中。
文件:$ mvnProject /src / main / resources / log4j.properties
1
2
3
4
5
log4j.rootLogger=DEBUG, ACT
?
log4j.appender.ACT=org.apache.log4j.ConsoleAppender
log4j.appender.ACT.layout=org.apache.log4j.PatternLayout
log4j.appender.ACT.layout.ConversionPattern=%d{hh:mm:ss,SSS} [%t] %-5p %c %x - %m%n
?
使用空白main創(chuàng)建一個(gè)新的Java類(lèi)。
文件:$ mvnProject /src / main / java / com / example / OnboardingRequest.java
1
2
3
4
5
6
7
package com.example;
?
publicclassOnboardingRequest {
?publicstaticvoidmain(String[] args) {
???
?}
}
?
添加到主要入口點(diǎn)是創(chuàng)建Process Engine。添加到OnboardingRequest.java,如下圖所示:
添加到主要入口點(diǎn)是創(chuàng)建Process Engine。添加到OnboardingRequest.java,如下圖所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.example;
?
importorg.activiti.engine.ProcessEngine;
importorg.activiti.engine.ProcessEngineConfiguration;
importorg.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration;
?
publicclassOnboardingRequest {
?publicstaticvoidmain(String[] args) {
???ProcessEngineConfiguration cfg = newStandaloneProcessEngineConfiguration()
?????.setJdbcUrl("jdbc:h2:mem:activiti;DB_CLOSE_DELAY=1000")
?????.setJdbcUsername("sa")
?????.setJdbcPassword("")
?????.setJdbcDriver("org.h2.Driver")
?????.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
???ProcessEngine processEngine = cfg.buildProcessEngine();
???String pName = processEngine.getName();
???String ver = ProcessEngine.VERSION;
???System.out.println("ProcessEngine[" + pName + "]Version: [" + ver + "]");
?}
}
?
文件:$ mvnProject /src / main / java / com / example / OnboardingRequest.java
添加行 | 說(shuō)明 |
3-4 | Activiti流程引擎和配置。 |
5,9 | 獨(dú)立環(huán)境的配置幫助程序(例如,不使用依賴項(xiàng)管理器)。 |
9-15 | 使用基于內(nèi)存的h2嵌入式數(shù)據(jù)庫(kù)創(chuàng)建Process Engine。 |
16-18 | 顯示Process Engine配置和Activiti版本。 |
Activiti支持依賴注入
- Activiti是專(zhuān)為并且可以輕松利用依賴注入而構(gòu)建的。有關(guān)詳細(xì)信息,請(qǐng)查看Activiti用戶指南。
Activiti與許多數(shù)據(jù)庫(kù)提供商合作
- “?$actUnzipedPack/ database / create”中的數(shù)據(jù)庫(kù)腳本
- Activiti用戶指南(各種開(kāi)發(fā)和管理部分)
支持IDE和平臺(tái)獨(dú)立以及此快速入門(mén)的簡(jiǎn)單性,添加“胖罐”配置,如下面第1-28行到pom.xml中所示。
文件:$ mvnProject /pom.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
...
?<build>
...
???<plugins>
...
?????<!--Maven Assembly Plugin -->
?????<plugin>
???????<groupId>org.apache.maven.plugins</groupId>
???????<artifactId>maven-assembly-plugin</artifactId>
???????<version>2.4.1</version>
???????<configuration>
????????? <!-- get all project dependencies -->
????????? <descriptorRefs>
??????????? <descriptorRef>jar-with-dependencies</descriptorRef>
????????? </descriptorRefs>
????????? <!-- MainClass in mainfest make aexecutable jar -->
????????? <archive>
??????????? <manifest>
????????????? <mainClass>com.example.OnboardingRequest</mainClass>
??????????? </manifest>
????????? </archive>
???????</configuration>
???????<executions>
????????? <execution>
??????????? <id>make-assembly</id>
??????????? <!-- bind to the packaging phase -->
??????????? <phase>package</phase>
??????????? <goals>
????????????? <goal>single</goal>
??????????? </goals>
????????? </execution>
???????</executions>
?????</plugin>
...
???</plugins>
...
?</build>
...
</project>
?
通過(guò)運(yùn)行“mvn package”打包代碼。
命令:mvn包
基本路徑:$ mvnProject
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
[INFO] Scanning for projects...
[INFO]????????????????????????????????????????????????????????????????????????
[INFO]------------------------------------------------------------------------
[INFO] Building $quickStartJavaProjectName0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ $quickStartJavaProjectName ---
[WARNING] Using platform encoding(UTF-8 actually) to copyfiltered resources, i.e. build is platform dependent!
[INFO] Copying 1 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.5.1:compile (default-compile) @HelloProcess2 ---
[INFO] Nothing to compile - allclasses are up to date
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources)@ HelloProcess2 ---
[WARNING] Using platform encoding(UTF-8 actually) to copyfiltered resources, i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.5.1:testCompile (default-testCompile) @HelloProcess2 ---
[INFO] Nothing to compile - allclasses are up to date
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ HelloProcess2---
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ HelloProcess2 ---
[INFO] Building jar: $mvnProject/target/$quickStartJavaProjectName-0.0.1-SNAPSHOT.jar
[INFO] META-INF/maven/$quickStartJavaProjectName/HelloProcess2/pom.xmlalready added, skipping
[INFO] META-INF/maven/$quickStartJavaProjectName/$quickStartJavaProjectName/pom.properties alreadyadded, skipping
[INFO]
[INFO] --- maven-assembly-plugin:2.4.1:single (make-assembly) @ $quickStartJavaProjectName ---
[INFO] Building jar: $mvnProject/target/$quickStartJavaProjectName-0.0.1-SNAPSHOT-jar-with-dependencies.jar
[INFO]------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO]------------------------------------------------------------------------
[INFO] Total time: 3.029s
[INFO] Finished at: Sun Nov 2707:23:43 EST 2016
[INFO] Final Memory: 33M/702M
[INFO]------------------------------------------------------------------------
?
筆記:
- 您的輸出可能看起來(lái)不同。這里的重要輸出是“BUILD SUCCESS”上面的行,顯示了帶有依賴關(guān)系的jar的成功:?
- “[INFO]構(gòu)建jar:$mvnProject/ target /?$quickStartJavaProjectName-0.0.1-SNAPSHOT-jar-with-dependencies.jar”
支持IDE和平臺(tái)獨(dú)立以及此快速入門(mén)的簡(jiǎn)單性,從命令行運(yùn)行Java程序,如下圖所示。
命令:cd target
命令:java -jar ActivitiDeveloperQuickStart-0.0.1-SNAPSHOT-jar-with-dependencies.jar
-要么-
java -jar $ quickStartJavaProjectName-0.0.1-SNAPSHOT-jar-with-dependencies.jar
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
11:45:32,849 [main] DEBUGorg.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl? - initializing datasource to db:jdbc:h2:mem:activiti;DB_CLOSE_DELAY=1000
11:45:32,856 [main] DEBUGorg.apache.ibatis.logging.LogFactory? -Logging initialized using 'classorg.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.
?
...
?
11:45:33,777 [main] DEBUGorg.activiti.engine.impl.db.DbSqlSession? - SQL: create tableACT_PROCDEF_INFO (?
ID_ varchar(64) not null,?
PROC_DEF_ID_ varchar(64) not null,?
REV_ integer,?
INFO_JSON_ID_ varchar(64),?
primary key (ID_)?
)
?
...
?
11:45:33,835 [main] DEBUGorg.activiti.engine.impl.db.DbSqlSession? - activiti db schema create for component identitysuccessful
11:45:33,835 [main] DEBUGorg.activiti.engine.impl.db.DbSqlSession? - flush summary: 0 insert, 0 update, 0 delete.
11:45:33,835 [main] DEBUGorg.activiti.engine.impl.db.DbSqlSession? - now executing flush...
11:45:33,835 [main] DEBUGorg.activiti.engine.impl.cfg.standalone.StandaloneMybatisTransactionContext?- firing event committing...
11:45:33,835 [main] DEBUGorg.activiti.engine.impl.cfg.standalone.StandaloneMybatisTransactionContext?- committing the ibatis sql session...
11:45:33,835 [main] DEBUGorg.activiti.engine.impl.cfg.standalone.StandaloneMybatisTransactionContext?- firing event committed...
11:45:33,836 [main] DEBUGorg.apache.ibatis.transaction.jdbc.JdbcTransaction? - Resetting autocommitto true on JDBC Connection[conn0: url=jdbc:h2:mem:activiti user=SA]
11:45:33,836 [main] DEBUGorg.apache.ibatis.transaction.jdbc.JdbcTransaction? - Closing JDBCConnection [conn0: url=jdbc:h2:mem:activiti user=SA]
11:45:33,836 [main] DEBUGorg.apache.ibatis.datasource.pooled.PooledDataSource? - Returnedconnection 667346055 to pool.
11:45:33,836 [main] DEBUGorg.activiti.engine.impl.interceptor.LogInterceptor? - ---SchemaOperationsProcessEngineBuild finished--------------------------------------------------------
11:45:33,836 [main] DEBUGorg.activiti.engine.impl.interceptor.LogInterceptor? -?
?
11:45:33,836 [main] INFO?org.activiti.engine.impl.ProcessEngineImpl? - ProcessEngine defaultcreated
ProcessEngine [default] Version: [$actVer]
?
筆記:
- 感興趣的關(guān)鍵輸出是打印您的Activiti版本:$actVer?它應(yīng)該與配置的版本匹配
- “[INFO]構(gòu)建jar:$mvnProject / target /?$quickStartJavaProjectName-0.0.1-SNAPSHOT-jar-with-dependencies.jar”
或者,當(dāng)然,您可以在IDE中運(yùn)行相同的程序。例如,在Eclipse中,選擇OnboardingRequest.java文件,然后右鍵單擊“Run As> Java Application”。如果從IDE中運(yùn)行程序,結(jié)果應(yīng)該相同(通常顯示在IDE的控制臺(tái)視圖中)。
您已經(jīng)在這個(gè)簡(jiǎn)單的Java程序中成功嵌入了Activiti的BPM引擎。
?
4.部署流程定義
?
我們現(xiàn)在準(zhǔn)備為Activiti Engine添加額外的BPM邏輯。
為此,正如我們的OnboardingRequest Java類(lèi)的名稱(chēng)所示,我們將使用簡(jiǎn)單的Onboarding過(guò)程。在這個(gè)例子中,我們將輸入數(shù)據(jù)。然后,如果經(jīng)驗(yàn)?zāi)陻?shù)超過(guò)3,則將發(fā)布個(gè)性化入職歡迎消息的任務(wù)。在該任務(wù)中,用戶將手動(dòng)將數(shù)據(jù)輸入到虛擬后端系統(tǒng)中。如果多年的經(jīng)驗(yàn)是3年或更短,那么簡(jiǎn)單地,通用地,自動(dòng)地將數(shù)據(jù)與虛擬后端系統(tǒng)集成。
Activiti的Process Engine符合BPMN 2.0標(biāo)準(zhǔn)。在視覺(jué)上,上面的過(guò)程可以這樣建模:
?
這個(gè)例子非常簡(jiǎn)單。并且,根據(jù)要求,可以通過(guò)幾種不同的方式對(duì)其進(jìn)行建模。雖然它也可以協(xié)調(diào)簡(jiǎn)單的流程,但請(qǐng)注意,Activiti可以處理數(shù)十個(gè),數(shù)百個(gè)甚至數(shù)千個(gè)步驟的非常復(fù)雜的流程。
上面的可視化過(guò)程模型的基礎(chǔ)是BPMN的XML結(jié)構(gòu)。在這種情況下,XML文檔是onboarding.bpmn20.xml。這個(gè)快速入門(mén)不會(huì)深入到底層XML BPMN結(jié)構(gòu)的深度,而是專(zhuān)注于針對(duì)Activiti API開(kāi)發(fā)的機(jī)制以及將Activiti嵌入到您的應(yīng)用程序中。然而,為了支持下面的邏輯,這里是相關(guān)BPMN形狀和基礎(chǔ)XML中編寫(xiě)的定義邏輯的摘要:?
?
BPMN形狀 | Onboarding.bpmn20.xml行 | 注釋 |
8 | 開(kāi)始活動(dòng) | |
9-15 | 用戶任務(wù)收集2個(gè)表單屬性:“fullName”和“yearsOfExperience”。請(qǐng)注意,第9行的候選組設(shè)置為“管理員”。 | |
21-27 | 用戶任務(wù)收集1表單屬性:“personalWelcomeTime”。請(qǐng)注意,第22行的候選組設(shè)置為“管理員”。 | |
31-35 | 腳本任務(wù)表示自動(dòng)數(shù)據(jù)輸入到虛擬后端。請(qǐng)注意,雖然簡(jiǎn)單,但有一個(gè)簡(jiǎn)單的腳本可以設(shè)置一個(gè)過(guò)程變量autoWelcomeTime(第34-35行):var dateAsString = new Date().toString(); execution.setVariable("autoWelcomeTime", dateAsString); | |
18 | 定義“經(jīng)驗(yàn)歲月”專(zhuān)屬網(wǎng)關(guān)。(決定將產(chǎn)生一條或另一條路徑。) | |
37-39 | 使用yearsOfExperience變量表示“> 3”邏輯:${yearsOfExperience > 3} | |
18,36 | 在專(zhuān)用網(wǎng)關(guān)(第18行)上,注意指向“automatedIntroPath(第36行)”的默認(rèn)節(jié),表示條件“> 3”的邏輯“else”。 | |
298 | 結(jié)束事件 |
文件:$ mvnProject / src/ main / java / com / example / OnboardingRequest.java
添加行 | 說(shuō)明 |
25-27 | 加載提供的BPMN模型并將其部署到Activiti Process Engine。 |
28-33 | 檢索已部署的模型,證明它位于Activiti存儲(chǔ)庫(kù)中。 |
有關(guān)BPMN及其在Activiti中的使用的更多信息,請(qǐng)參閱Activiti?用戶指南中的各個(gè)部分。
下載onboarding.bpmn20.xml文件,下面的整個(gè)XML結(jié)構(gòu),并將onboarding.bpmn20.xml文件復(fù)制到路徑$mvnProject/ src / main / resources /。
?
文件:$ mvnProject /src / main / resources / onboarding.bpmn20.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
<?xml version="1.0"encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:xsd="http://www.w3.org/2001/XMLSchema"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"typeLanguage="http://www.w3.org/2001/XMLSchema"expressionLanguage="http://www.w3.org/1999/XPath"targetNamespace="http://www.activiti.org/processdef">
? <process id="onboarding"name="Onboarding"isExecutable="true">
? ? <startEvent id="startOnboarding"name="Start"activiti:initiator="initiator"></startEvent>
? ? <userTask id="enterOnboardingData"name="Enter Data"activiti:assignee="${initiator}"activiti:candidateGroups="managers">
? ? ? <extensionElements>
? ? ? ? <activiti:formProperty id="fullName"name="Full Name"type="string"></activiti:formProperty>
? ? ? ? <activiti:formProperty id="yearsOfExperience"name="Years of Experience"type="long"required="true"></activiti:formProperty>
? ? ? </extensionElements>
? ? </userTask>
? ? <sequenceFlow id="sid-1337EA98-7364-4198-B5D9-30F5341D6918"sourceRef="startOnboarding"targetRef="enterOnboardingData"></sequenceFlow>
? ? <exclusiveGateway id="decision"name="Years of Experience"default="automatedIntroPath"></exclusiveGateway>
? ? <sequenceFlow id="sid-42BE5661-C3D5-4DE6-96F5-73D34822727A"sourceRef="enterOnboardingData"targetRef="decision"></sequenceFlow>
? ? <userTask id="personalizedIntro"name="Personalized Introduction and DataEntry"activiti:assignee="${initiator}"activiti:candidateGroups="managers">
? ? ? <extensionElements>
? ? ? ? <activiti:formProperty id="personalWelcomeTime"name="Personal Welcome Time"type="date"datePattern="MM-dd-yyyy hh:mm"></activiti:formProperty>
? ? ? </extensionElements>
? ? </userTask>
? ? <endEvent id="endOnboarding"name="End"></endEvent>
? ? <sequenceFlow id="sid-37A73ACA-2E23-400B-96F3-71F77738DAFA"sourceRef="automatedIntro"targetRef="endOnboarding"></sequenceFlow>
? ? <scriptTask id="automatedIntro"name="Generic and Automated Data Entry"scriptFormat="javascript"activiti:autoStoreVariables="false">
? ? ? <script><![CDATA[var dateAsString = newDate().toString();
execution.setVariable("autoWelcomeTime", dateAsString);]]></script>
? ? </scriptTask>
? ? <sequenceFlow id="automatedIntroPath"sourceRef="decision"targetRef="automatedIntro"></sequenceFlow>
? ? <sequenceFlow id="personalizedIntroPath"name=">3"sourceRef="decision"targetRef="personalizedIntro">
? ? ? <conditionExpression xsi:type="tFormalExpression"><![CDATA[${yearsOfExperience > 3}]]></conditionExpression>
? ? </sequenceFlow>
? ? <sequenceFlow id="sid-BA6F061B-47B6-428B-8CE6-739244B14BD6"sourceRef="personalizedIntro"targetRef="endOnboarding"></sequenceFlow>
? </process>
? <bpmndi:BPMNDiagram id="BPMNDiagram_onboarding">
? ? <bpmndi:BPMNPlane bpmnElement="onboarding"id="BPMNPlane_onboarding">
? ? ? <bpmndi:BPMNShape bpmnElement="startOnboarding"id="BPMNShape_startOnboarding">
? ? ? ? <omgdc:Bounds height="30.0"width="30.0"x="155.0"y="145.0"></omgdc:Bounds>
? ? ? </bpmndi:BPMNShape>
? ? ? <bpmndi:BPMNShape bpmnElement="enterOnboardingData"id="BPMNShape_enterOnboardingData">
? ? ? ? <omgdc:Bounds height="80.0"width="100.0"x="240.0"y="120.0"></omgdc:Bounds>
? ? ? </bpmndi:BPMNShape>
? ? ? <bpmndi:BPMNShape bpmnElement="decision"id="BPMNShape_decision">
? ? ? ? <omgdc:Bounds height="40.0"width="40.0"x="385.0"y="140.0"></omgdc:Bounds>
? ? ? </bpmndi:BPMNShape>
? ? ? <bpmndi:BPMNShape bpmnElement="personalizedIntro"id="BPMNShape_personalizedIntro">
? ? ? ? <omgdc:Bounds height="80.0"width="100.0"x="519.0"y="15.0"></omgdc:Bounds>
? ? ? </bpmndi:BPMNShape>
? ? ? <bpmndi:BPMNShape bpmnElement="endOnboarding"id="BPMNShape_endOnboarding">
? ? ? ? <omgdc:Bounds height="28.0"width="28.0"x="725.0"y="165.0"></omgdc:Bounds>
? ? ? </bpmndi:BPMNShape>
? ? ? <bpmndi:BPMNShape bpmnElement="automatedIntro"id="BPMNShape_automatedIntro">
? ? ? ? <omgdc:Bounds height="80.0"width="100.0"x="520.0"y="255.0"></omgdc:Bounds>
? ? ? </bpmndi:BPMNShape>
? ? ? <bpmndi:BPMNEdge bpmnElement="sid-37A73ACA-2E23-400B-96F3-71F77738DAFA"id="BPMNEdge_sid-37A73ACA-2E23-400B-96F3-71F77738DAFA">
? ? ? ? <omgdi:waypoint x="570.0"y="255.0"></omgdi:waypoint>
? ? ? ? <omgdi:waypoint x="570.0"y="179.0"></omgdi:waypoint>
? ? ? ? <omgdi:waypoint x="725.0"y="179.0"></omgdi:waypoint>
? ? ? </bpmndi:BPMNEdge>
? ? ? <bpmndi:BPMNEdge bpmnElement="sid-1337EA98-7364-4198-B5D9-30F5341D6918"id="BPMNEdge_sid-1337EA98-7364-4198-B5D9-30F5341D6918">
? ? ? ? <omgdi:waypoint x="185.0"y="160.0"></omgdi:waypoint>
? ? ? ? <omgdi:waypoint x="240.0"y="160.0"></omgdi:waypoint>
? ? ? </bpmndi:BPMNEdge>
? ? ? <bpmndi:BPMNEdge bpmnElement="automatedIntroPath"id="BPMNEdge_automatedIntroPath">
? ? ? ? <omgdi:waypoint x="405.0"y="180.0"></omgdi:waypoint>
? ? ? ? <omgdi:waypoint x="405.0"y="295.0"></omgdi:waypoint>
? ? ? ? <omgdi:waypoint x="520.0"y="295.0"></omgdi:waypoint>
? ? ? </bpmndi:BPMNEdge>
? ? ? <bpmndi:BPMNEdge bpmnElement="personalizedIntroPath"id="BPMNEdge_personalizedIntroPath">
? ? ? ? <omgdi:waypoint x="405.0"y="140.0"></omgdi:waypoint>
? ? ? ? <omgdi:waypoint x="405.0"y="55.0"></omgdi:waypoint>
? ? ? ? <omgdi:waypoint x="519.0"y="55.0"></omgdi:waypoint>
? ? ? </bpmndi:BPMNEdge>
? ? ? <bpmndi:BPMNEdge bpmnElement="sid-42BE5661-C3D5-4DE6-96F5-73D34822727A"id="BPMNEdge_sid-42BE5661-C3D5-4DE6-96F5-73D34822727A">
? ? ? ? <omgdi:waypoint x="340.0"y="160.0"></omgdi:waypoint>
? ? ? ? <omgdi:waypoint x="385.0"y="160.0"></omgdi:waypoint>
? ? ? </bpmndi:BPMNEdge>
? ? ? <bpmndi:BPMNEdge bpmnElement="sid-BA6F061B-47B6-428B-8CE6-739244B14BD6"id="BPMNEdge_sid-BA6F061B-47B6-428B-8CE6-739244B14BD6">
? ? ? ? <omgdi:waypoint x="619.0"y="55.0"></omgdi:waypoint>
? ? ? ? <omgdi:waypoint x="739.0"y="55.0"></omgdi:waypoint>
? ? ? ? <omgdi:waypoint x="739.0"y="165.0"></omgdi:waypoint>
? ? ? </bpmndi:BPMNEdge>
? ? </bpmndi:BPMNPlane>
? </bpmndi:BPMNDiagram>
</definitions>
?
添加到OnboardingRequest.java,如下圖所示:
文件:$ mvnProject /src / main / java / com / example / OnboardingRequest.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package com.example;
?
import java.text.ParseException;
?
importorg.activiti.engine.ProcessEngine;
importorg.activiti.engine.ProcessEngineConfiguration;
importorg.activiti.engine.RepositoryService;
importorg.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration;
import org.activiti.engine.repository.Deployment;
importorg.activiti.engine.repository.ProcessDefinition;
?
publicclassOnboardingRequest {
? publicstaticvoidmain(String[] args) throws ParseException {
? ?ProcessEngineConfiguration cfg = new StandaloneProcessEngineConfiguration()
? ? ? ?.setJdbcUrl("jdbc:h2:mem:activiti;DB_CLOSE_DELAY=1000")
? ? ? ?.setJdbcUsername("sa")
? ? ? ?.setJdbcPassword("")
? ? ? ?.setJdbcDriver("org.h2.Driver")
? ? ? ? .setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
? ? ProcessEngineprocessEngine = cfg.buildProcessEngine();
? ? String pName =processEngine.getName();
? ? String ver =ProcessEngine.VERSION;
? ? System.out.println("ProcessEngine [" + pName + "] Version: [" + ver + "]");
?
? ? RepositoryServicerepositoryService = processEngine.getRepositoryService();
? ? Deployment deployment =repositoryService.createDeployment()
? ? ? ?.addClasspathResource("onboarding.bpmn20.xml").deploy();
? ? ProcessDefinitionprocessDefinition = repositoryService.createProcessDefinitionQuery()
? ? ? ?.deploymentId(deployment.getId()).singleResult();
? ? System.out.println(
? ? ? ? "Found process definition ["?
? ? ? ? ?? + processDefinition.getName() + "] with id ["?
? ? ? ? ?? + processDefinition.getId() + "]");
? }
}
?
文件:$ mvnProject /src / main / java / com / example / OnboardingRequest.java
添加行 | 說(shuō)明 |
25-27 | 加載提供的BPMN模型并將其部署到Activiti Process Engine。 |
28-33 | 檢索已部署的模型,證明它位于Activiti存儲(chǔ)庫(kù)中。 |
通過(guò)運(yùn)行“mvn package”打包代碼。
像以前一樣運(yùn)行Java程序。示例輸出如下所示。
命令:java -jarActivitiDeveloperQuickStart-0.0.1-SNAPSHOT-jar-with-dependencies.jar
-要么-
java -jar $quickStartJavaProjectName-0.0.1-SNAPSHOT-jar-with-dependencies.jar
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
...
?
02:01:19,277 [main] INFO?org.activiti.engine.impl.ProcessEngineImpl? - ProcessEngine defaultcreated
processEngine [default] version: [5.22.0.0]
?
...
?
02:01:19,327 [main] DEBUGorg.activiti.engine.impl.bpmn.deployer.BpmnDeployer? - Processingdeployment null
02:01:19,327 [main] INFO?org.activiti.engine.impl.bpmn.deployer.BpmnDeployer? - Processing resourceonboarding.bpmn20.xml
02:01:19,444 [main] DEBUGorg.activiti.engine.impl.bpmn.parser.handler.ProcessParseHandler? -Parsing process
?
...
?
02:01:21,696 [main] DEBUGorg.apache.ibatis.datasource.pooled.PooledDataSource? - Returnedconnection 667346055 to pool.
02:01:21,696 [main] DEBUGorg.activiti.engine.impl.interceptor.LogInterceptor? - --- DeployCmdfinished --------------------------------------------------------
?
...
?
02:01:21,696 [main] DEBUGorg.activiti.engine.impl.interceptor.LogInterceptor? - --- startingProcessDefinitionQueryImpl--------------------------------------------------------
?
...
?
02:01:21,710 [main] DEBUGorg.apache.ibatis.datasource.pooled.PooledDataSource? - Returnedconnection 667346055 to pool.
02:01:21,710 [main] DEBUGorg.activiti.engine.impl.interceptor.LogInterceptor? - ---ProcessDefinitionQueryImpl finished--------------------------------------------------------
02:01:21,710 [main] DEBUGorg.activiti.engine.impl.interceptor.LogInterceptor? -?
?
Found process definition [Onboarding]with id [onboarding:1:4]
?
筆記:
- 這里感興趣的關(guān)鍵輸出是列表行,它記錄了進(jìn)程名稱(chēng)“Onboarding”和“onboarding:1:4”的唯一進(jìn)程ID(包括部署版本)
您的應(yīng)用程序現(xiàn)在在運(yùn)行時(shí)部署Onboarding進(jìn)程。
5.運(yùn)行流程實(shí)例
?
部署的進(jìn)程可以使用Activiti API來(lái)啟動(dòng),運(yùn)行,查看歷史記錄以及以其他方式管理流程實(shí)例。此快速入門(mén)使用Java代碼運(yùn)行流程實(shí)例。
有關(guān)使用Restful Services管理流程實(shí)例的示例,請(qǐng)參閱Sample Onboarding Quick Start。
將Activiti的日志記錄級(jí)別從DEBUG設(shè)置為WARN,如下面的第1行所示。
文件:$ mvnProject /src / main / resources / log4j.properties
1
2
3
4
5
log4j.rootLogger=WARN, ACT
?
log4j.appender.ACT=org.apache.log4j.ConsoleAppender
log4j.appender.ACT.layout=org.apache.log4j.PatternLayout
log4j.appender.ACT.layout.ConversionPattern=%d{hh:mm:ss,SSS} [%t] %-5p %c %x - %m%n
?
重要提示:??以下示例代碼說(shuō)明了Activiti基于標(biāo)準(zhǔn)的可嵌入流程引擎的靈活性和強(qiáng)大功能。但是,此代碼在錯(cuò)誤處理,代碼組織和一般設(shè)計(jì)方面并不代表最佳實(shí)踐。相反,目的是快速說(shuō)明許多想法,以便熟悉Activiti的力量。根據(jù)您自己的需要重新考慮以下示例。
添加到OnboardingRequest.java,如下圖所示:
文件:$ mvnProject /src / main / java / com / example / OnboardingRequest.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
package com.example;
?
import java.text.DateFormat;
import java.text.ParseException;
importjava.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
?
importorg.activiti.engine.FormService;
importorg.activiti.engine.HistoryService;
importorg.activiti.engine.ProcessEngine;
importorg.activiti.engine.ProcessEngineConfiguration;
importorg.activiti.engine.RepositoryService;
importorg.activiti.engine.RuntimeService;
importorg.activiti.engine.TaskService;
importorg.activiti.engine.form.FormData;
importorg.activiti.engine.form.FormProperty;
importorg.activiti.engine.history.HistoricActivityInstance;
importorg.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration;
importorg.activiti.engine.impl.form.DateFormType;
importorg.activiti.engine.impl.form.LongFormType;
importorg.activiti.engine.impl.form.StringFormType;
importorg.activiti.engine.repository.Deployment;
importorg.activiti.engine.repository.ProcessDefinition;
importorg.activiti.engine.runtime.ProcessInstance;
importorg.activiti.engine.task.Task;
?
publicclassOnboardingRequest {
? publicstaticvoidmain(String[] args) throws ParseException {
? ?ProcessEngineConfiguration cfg = new StandaloneProcessEngineConfiguration()
? ? ? ?.setJdbcUrl("jdbc:h2:mem:activiti;DB_CLOSE_DELAY=1000")
? ? ? ?.setJdbcUsername("sa")
? ? ? ?.setJdbcPassword("")
? ? ? ?.setJdbcDriver("org.h2.Driver")
? ? ? ?.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
? ? ProcessEngineprocessEngine = cfg.buildProcessEngine();
? ? String pName =processEngine.getName();
? ? String ver =ProcessEngine.VERSION;
? ? System.out.println("ProcessEngine [" + pName + "] Version: [" + ver + "]");
?
? ? RepositoryServicerepositoryService = processEngine.getRepositoryService();
? ? Deployment deployment =repositoryService.createDeployment()
? ? ? ?.addClasspathResource("onboarding.bpmn20.xml").deploy();
? ? ProcessDefinitionprocessDefinition = repositoryService.createProcessDefinitionQuery()
? ? ? ?.deploymentId(deployment.getId()).singleResult();
? ? System.out.println(
? ? ? ? "Found process definition ["?
? ? ? ? ?? + processDefinition.getName() + "] with id ["?
? ? ? ? ?? + processDefinition.getId() + "]");
??
? ? RuntimeServiceruntimeService = processEngine.getRuntimeService();
? ? ProcessInstanceprocessInstance = runtimeService
? ? ? ?.startProcessInstanceByKey("onboarding");
? ? System.out.println("Onboarding process started with processinstance id ["?
? ? ? ? +processInstance.getProcessInstanceId()
? ? ? ? + "] key [" +processInstance.getProcessDefinitionKey() + "]");
?? ?
? ? TaskService taskService= processEngine.getTaskService();
? ? FormService formService= processEngine.getFormService();
? ? HistoryServicehistoryService = processEngine.getHistoryService();
?
? ? Scanner scanner = new Scanner(System.in);
? ? while (processInstance != null &&!processInstance.isEnded()) {
? ? ? List<Task>tasks = taskService.createTaskQuery()
? ? ? ? ?.taskCandidateGroup("managers").list();
? ? ?System.out.println("Activeoutstanding tasks: [" + tasks.size() + "]");
? ? ? for (int i = 0; i < tasks.size(); i++) {
? ? ? ? Task task= tasks.get(i);
? ? ? ?System.out.println("ProcessingTask [" + task.getName() + "]");
? ? ? ?Map<String, Object> variables = new HashMap<String,Object>();
? ? ? ? FormDataformData = formService.getTaskFormData(task.getId());
? ? ? ? for (FormPropertyformProperty : formData.getFormProperties()) {
? ? ? ? ? if(StringFormType.class.isInstance(formProperty.getType())) {
? ? ? ? ?? System.out.println(formProperty.getName() + "?");
? ? ? ? ?? String value = scanner.nextLine();
? ? ? ? ?? variables.put(formProperty.getId(), value);
? ? ? ? ? } elseif(LongFormType.class.isInstance(formProperty.getType())) {
? ? ? ? ?? System.out.println(formProperty.getName() + "? (Must be a whole number)");
? ? ? ? ?? Long value = Long.valueOf(scanner.nextLine());
? ? ? ? ?? variables.put(formProperty.getId(), value);
? ? ? ? ? } elseif(DateFormType.class.isInstance(formProperty.getType())) {
? ? ? ? ?? System.out.println(formProperty.getName() + "? (Must be a date m/d/yy)");
? ? ? ? ?? DateFormat dateFormat = new SimpleDateFormat("m/d/yy");
? ? ? ? ?? Date value = dateFormat.parse(scanner.nextLine());
? ? ? ? ?? variables.put(formProperty.getId(), value);
? ? ? ? ? } else {
? ? ? ? ?? System.out.println("<formtype not supported>");
? ? ? ? ? }
? ? ? ? }
? ? ? ?taskService.complete(task.getId(), variables);
?
? ? ? ?HistoricActivityInstance endActivity = null;
? ? ? ?List<HistoricActivityInstance> activities =?
? ? ? ? ?? historyService.createHistoricActivityInstanceQuery()
? ? ? ? ?? .processInstanceId(processInstance.getId()).finished()
? ? ? ? ?? .orderByHistoricActivityInstanceEndTime().asc()
? ? ? ? ?? .list();
? ? ? ? for (HistoricActivityInstanceactivity : activities) {
? ? ? ? ? if(activity.getActivityType() == "startEvent") {
? ? ? ? ?? System.out.println("BEGIN" + processDefinition.getName()?
? ? ? ? ?? ? ? + "[" + processInstance.getProcessDefinitionKey()
? ? ? ? ?? ? ? + "]" + activity.getStartTime());
? ? ? ? ? }
? ? ? ? ? if(activity.getActivityType() == "endEvent") {
? ? ? ? ?? // Handleedge case where end step happens so fast that the end step
? ? ? ? ?? // andprevious step(s) are sorted the same. So, cache the end step?
? ? ? ? ?? //anddisplay it last to represent the logical sequence.
? ? ? ? ?? endActivity = activity;
? ? ? ? ? } else {
? ? ? ? ?? System.out.println("--" + activity.getActivityName()?
? ? ? ? ?? ? ? + "[" + activity.getActivityId() + "] "
? ? ? ? ?? ? ? + activity.getDurationInMillis() + " ms");
? ? ? ? ? }
? ? ? ? }
? ? ? ? if (endActivity != null) {
? ? ? ? ?System.out.println("--" + endActivity.getActivityName()?
? ? ? ? ?? ? ? + "[" + endActivity.getActivityId() + "] "
? ? ? ? ?? ? ? + endActivity.getDurationInMillis() + " ms");
? ? ? ? ?System.out.println("COMPLETE" + processDefinition.getName() + " ["
? ? ? ? ?? ? ? + processInstance.getProcessDefinitionKey() + "] "?
? ? ? ? ?? ? ? + endActivity.getEndTime());
? ? ? ? }
? ? ? }
? ? ? // Re-query the process instance, making surethe latest state is available
? ? ? processInstance =runtimeService.createProcessInstanceQuery()
? ? ? ? ?.processInstanceId(processInstance.getId()).singleResult();
? ? }
? ? scanner.close();
? }
}
?
文件:$ mvnProject /src / main / java / com / example / OnboardingRequest.java
添加行 | 說(shuō)明 |
12-13,17-21,28-39 | Activiti API中的主要服務(wù)導(dǎo)入用于流程管理。 |
54-59 | 啟動(dòng)Onboarding進(jìn)程的實(shí)例。 |
61-62,67,71-93 | 從符合“管理員”角色和完成任務(wù)的任務(wù)中收集命令行輸入。 |
23-25,76,80,84 | 基于流程模型中定義的表單屬性類(lèi)型,提示用戶輸入特定于類(lèi)型的輸入。 |
63,95-125 | 顯示過(guò)程歷史記錄。 |
23-25 | 檢索已部署的模型,證明它位于Activiti存儲(chǔ)庫(kù)中 |
通過(guò)運(yùn)行“mvn package”打包代碼。
像以前一樣運(yùn)行Java程序。注意下面提到的示例輸出。
命令:java -jarActivitiDeveloperQuickStart-0.0.1-SNAPSHOT-jar-with-dependencies.jar
-要么-
java -jar $quickStartJavaProjectName-0.0.1-SNAPSHOT-jar-with-dependencies.jar
基本路徑:$ mvnProject
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ProcessEngine [default] Version: [5.22.0.0]
Found process definition [Onboarding]with id [onboarding:1:4]
Onboarding process started withprocess instance id [5] key [onboarding]
Active outstanding tasks: [1]
Processing Task [Enter Data]
Full Name?
John Doe
Years of Experience? (Must be a wholenumber)
2
BEGIN Onboarding [onboarding] Sun Nov 2721:36:21 EST 2016
-- Start [startOnboarding] 4 ms
-- Enter Data [enterOnboardingData] 16855 ms
-- Years of Experience [decision] 3 ms
-- Generic and Automated Data Entry[automatedIntro] 322 ms
-- End [endOnboarding] 0 ms
COMPLETE Onboarding [onboarding] SunNov 2721:36:38 EST 2016
?
筆記:
- 觀察2年經(jīng)驗(yàn)在“經(jīng)驗(yàn)歲月”決定之后看到腳本任務(wù)“通用和自動(dòng)數(shù)據(jù)輸入”之后的流程路徑,然后流程結(jié)束。
命令:java -jar ActivitiDeveloperQuickStart-0.0.1-SNAPSHOT-jar-with-dependencies.jar
-要么-
java -jar $quickStartJavaProjectName-0.0.1-SNAPSHOT-jar-with-dependencies.jar
基本路徑:$ mvnProject
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
ProcessEngine [default] Version: [5.22.0.0]
Found process definition [Onboarding]with id [onboarding:1:4]
Onboarding process started withprocess instance id [5] key [onboarding]
Active outstanding tasks: [1]
Processing Task [Enter Data]
Full Name?
John Doe
Years of Experience? (Must be a wholenumber)
5
BEGIN Onboarding [onboarding] Sun Nov 2721:39:26 EST 2016
-- Start [startOnboarding] 5 ms
-- Enter Data [enterOnboardingData] 7810 ms
-- Years of Experience [decision] 2 ms
Active outstanding tasks: [1]
Processing Task [PersonalizedIntroduction and Data Entry]
Personal Welcome Time? (Must be a datem/d/yy)
12/9/16?
BEGIN Onboarding [onboarding] Sun Nov 2721:39:26 EST 2016
-- Start [startOnboarding] 5 ms
-- Enter Data [enterOnboardingData] 7810 ms
-- Years of Experience [decision] 2 ms
-- Personalized Introduction and DataEntry [personalizedIntro] 20231 ms
-- End [endOnboarding] 0 ms
COMPLETE Onboarding [onboarding] SunNov 2721:39:54 EST 2016
?
筆記:
- 觀察5年經(jīng)驗(yàn)在“經(jīng)驗(yàn)歲月”決定之后看到用戶任務(wù)“個(gè)性化介紹和數(shù)據(jù)輸入”之后的流程路徑。然后過(guò)程結(jié)束。
雖然簡(jiǎn)單,但這個(gè)嵌入式示例顯示了您的應(yīng)用程序如何將流程邏輯外部化為基于標(biāo)準(zhǔn)的建模和代碼友好的開(kāi)發(fā)模型。
6.用Java編寫(xiě)服務(wù)任務(wù)
?
如前所述,我們的流程有一個(gè)活動(dòng)“通用和自動(dòng)數(shù)據(jù)輸入”(一種虛假的后端調(diào)用),當(dāng)入門(mén)年經(jīng)驗(yàn)不超過(guò)3時(shí),它有條件地運(yùn)用。如所提供的,這是一個(gè)“腳本任務(wù)”。在這種情況下,執(zhí)行了一小段Javascript,說(shuō)明了系統(tǒng)處理步驟。我們將把這個(gè)腳本任務(wù)遷移到Java中,以說(shuō)明Java的全部功能如何滿足各種流程要求。
創(chuàng)建一個(gè)新的Java類(lèi),如下所示:
文件:$ mvnProject /src / main / java / com / example / AutomatedDataDelegate.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.example;
?
import java.util.Date;
?
importorg.activiti.engine.delegate.DelegateExecution;
importorg.activiti.engine.delegate.JavaDelegate;
?
publicclassAutomatedDataDelegate implements JavaDelegate {
?
? @Override
? publicvoidexecute(DelegateExecutionexecution) throws Exception {
? ? Date now = new Date();
? ? execution.setVariable("autoWelcomeTime", now);
? ? System.out.println("Faux call to backend for ["?
? ? + execution.getVariable("fullName") + "]");
? }
?
}
?
文件:$ mvnProject /src / main / java / com / example / OnboardingRequest.java
添加行 | 說(shuō)明 |
13 | 顯示設(shè)置過(guò)程變量。在這種情況下,變量autoWelcomeTime與當(dāng)前時(shí)間。 |
14 | 顯示檢索流程變量。 |
將腳本任務(wù)更改為指向AutomatedDataDelegate的服務(wù)任務(wù)。
之前:
文件:$ mvnProject /src / main / resources / onboarding.bpmn20.xml
1
2
3
4
5
6
7
8
9
<?xml version="1.0"encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:xsd="http://www.w3.org/2001/XMLSchema"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"typeLanguage="http://www.w3.org/2001/XMLSchema"expressionLanguage="http://www.w3.org/1999/XPath"targetNamespace="http://www.activiti.org/processdef">
? <process id="onboarding"name="Onboarding"isExecutable="true">
...
? ? <scriptTask id="automatedIntro"name="Generic and Automated Data Entry"scriptFormat="javascript"activiti:autoStoreVariables="false">
? ? ? <script><![CDATA[var dateAsString = newDate().toString();
execution.setVariable("autoWelcomeTime", dateAsString);]]></script>
? ? </scriptTask>
...
?
后:
文件:$ mvnProject /src / main / resources / onboarding.bpmn20.xml
1
2
3
4
5
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:xsd="http://www.w3.org/2001/XMLSchema"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"typeLanguage="http://www.w3.org/2001/XMLSchema"expressionLanguage="http://www.w3.org/1999/XPath"targetNamespace="http://www.activiti.org/processdef">
? <process id="onboarding"name="Onboarding"isExecutable="true">
...
? ?<serviceTask id="automatedIntro"name="Generic and Automated Data Entry"activiti:class="com.example.AutomatedDataDelegate"></serviceTask>
?
通過(guò)運(yùn)行“mvn package”打包代碼。
像以前一樣運(yùn)行Java程序。注意下面提到的示例輸出。
命令:java -jarActivitiDeveloperQuickStart-0.0.1-SNAPSHOT-jar-with-dependencies.jar
-要么-
java -jar $quickStartJavaProjectName-0.0.1-SNAPSHOT-jar-with-dependencies.jar
基本路徑:$ mvnProject
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
ProcessEngine [default] Version: [5.22.0.0]
Found process definition [Onboarding]with id [onboarding:1:4]
Onboarding process started withprocess instance id [5] key [onboarding]
Active outstanding tasks: [1]
Processing Task [Enter Data]
Full Name?
John Doe
Years of Experience? (Must be a wholenumber)
3
Faux call to backend for [John Doe]
BEGIN Onboarding [onboarding] Sun Nov 2722:57:32 EST 2016
-- Start [startOnboarding] 4 ms
-- Enter Data [enterOnboardingData] 10153 ms
-- Years of Experience [decision] 2 ms
-- Generic and Automated Data Entry[automatedIntro] 0 ms
-- End [endOnboarding] 0 ms
COMPLETE Onboarding [onboarding] SunNov 2722:57:42 EST 2016
?
筆記:
- 觀察輸出“[John Doe]后端的虛假調(diào)用”,說(shuō)明訪問(wèn)先前設(shè)置的過(guò)程變量。
這個(gè)簡(jiǎn)單的例子展示了在應(yīng)用程序中添加流程驅(qū)動(dòng)抽象的簡(jiǎn)單性和強(qiáng)大功能。
7.結(jié)論
?
觀察輸出“[John Doe]后端的虛假調(diào)用”,說(shuō)明訪問(wèn)先前設(shè)置的過(guò)程變量。
源代碼:https://github.com/daqiang123/ActivitiDeveloperQuickStart.git
總結(jié)
以上是生活随笔為你收集整理的Activiti6快速入门指南的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C语言的爱你永不悔
- 下一篇: 我们应该这样理解鸿蒙