Activiti6快速入门指南
Activiti6快速入門指南
這個快速入門假定:
- 熟悉Maven和Java
- 使用Java的開發環境
本教程將引用以下變量
變量 | 描述 |
$mvnProject | maven項目的根位置 |
$actUnzipedPack | 從http://www.activiti.org/download.html下載的解壓縮文件的根位置。 |
$quickStartJavaProjectName | Quick Start Java Project的名稱。建議將其作為“ActivitiDeveloperQuickStart”。 |
... | 為簡潔起見,請參閱跳過的信息。 |
$actVer | Activiti的版本目前正在運行。 |
1.簡介
?
本快速入門顯示了使用Activiti將業務流程管理(BPM)嵌入到您的應用程序中的簡單性。您將構建一個命令行應用程序,將基于標準的業務流程建模表示法(BPMN)邏輯嵌入到您的應用程序中。
Activiti擁有先進的流程設計工具,可將更復雜的BPM邏輯嵌入到您的應用程序中。這些工具包括基于Eclipse和基于Web的BPMN編輯器,僅舉幾例。為簡潔起見,本快速入門僅使用Activiti的Java API。
有關其他Activiti BPM工具的介紹,請參閱:
- 樣品入門快速入門
- Activiti用戶指南
本快速入門
- 一般來說,遠離特定于IDE的插圖(盡管它們是謹慎地完成的)。Activiti適用于任何Java友好的IDE。
- 使用Maven,但Gradle和Ivy等其他構建和依賴管理系統也可以工作。
2.創建和設置Maven項目
$quickStartJavaProjectName使用以下Maven依賴項創建名為“ActivitiDeveloperQuickStart”(以下稱為)的Java項目:
文件:$ 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>
?
當然,$actVer將替換為下載的Activiti版本。例如,如果您下載的Activiti軟件包是“activiti-6.0.0”,那么它的值$actVer將是6.0.0。
請注意以下依賴項:
- Activiti(org.activiti) - Activiti的BPM引擎
- 數據庫(com.h2database) - H2數據庫
- 記錄(org.slf4j) - Java的簡單日志外觀
在引用構建目錄時,本教程假定您的maven項目的標準Maven構建路徑:
路徑 | 描述 |
$mvnProject/ SRC /主/ JAVA | Java源目錄 |
$mvnProject/ src目錄/主/資源 | 資源目錄 |
$mvnProject/ SRC /測試/ JAVA | Java測試目錄 |
$mvnProject/ SRC /測試/資源 | 資源測試目錄 |
?
您應該能夠構建空白項目。在繼續之前,請確保整體狀態為“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]------------------------------------------------------------------------
?
?筆記:
- 您的輸出可能看起來不同。最值得注意的是,maven可能需要檢索項目依賴項。
3.創建流程引擎
?
正如之前在maven依賴關系摘要中所建議的那樣,Activiti利用Simple Logging Facade for Java(slf4j)進行日志記錄。在此示例應用程序中,我們將使用log4j日志記錄實現。將log4j.properties文件添加到項目中。
文件:$ 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創建一個新的Java類。
文件:$ mvnProject /src / main / java / com / example / OnboardingRequest.java
1
2
3
4
5
6
7
package com.example;
?
publicclassOnboardingRequest {
?publicstaticvoidmain(String[] args) {
???
?}
}
?
添加到主要入口點是創建Process Engine。添加到OnboardingRequest.java,如下圖所示:
添加到主要入口點是創建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
添加行 | 說明 |
3-4 | Activiti流程引擎和配置。 |
5,9 | 獨立環境的配置幫助程序(例如,不使用依賴項管理器)。 |
9-15 | 使用基于內存的h2嵌入式數據庫創建Process Engine。 |
16-18 | 顯示Process Engine配置和Activiti版本。 |
Activiti支持依賴注入
- Activiti是專為并且可以輕松利用依賴注入而構建的。有關詳細信息,請查看Activiti用戶指南。
Activiti與許多數據庫提供商合作
- “?$actUnzipedPack/ database / create”中的數據庫腳本
- Activiti用戶指南(各種開發和管理部分)
支持IDE和平臺獨立以及此快速入門的簡單性,添加“胖罐”配置,如下面第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>
?
通過運行“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]------------------------------------------------------------------------
?
筆記:
- 您的輸出可能看起來不同。這里的重要輸出是“BUILD SUCCESS”上面的行,顯示了帶有依賴關系的jar的成功:?
- “[INFO]構建jar:$mvnProject/ target /?$quickStartJavaProjectName-0.0.1-SNAPSHOT-jar-with-dependencies.jar”
支持IDE和平臺獨立以及此快速入門的簡單性,從命令行運行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]
?
筆記:
- 感興趣的關鍵輸出是打印您的Activiti版本:$actVer?它應該與配置的版本匹配
- “[INFO]構建jar:$mvnProject / target /?$quickStartJavaProjectName-0.0.1-SNAPSHOT-jar-with-dependencies.jar”
或者,當然,您可以在IDE中運行相同的程序。例如,在Eclipse中,選擇OnboardingRequest.java文件,然后右鍵單擊“Run As> Java Application”。如果從IDE中運行程序,結果應該相同(通常顯示在IDE的控制臺視圖中)。
您已經在這個簡單的Java程序中成功嵌入了Activiti的BPM引擎。
?
4.部署流程定義
?
我們現在準備為Activiti Engine添加額外的BPM邏輯。
為此,正如我們的OnboardingRequest Java類的名稱所示,我們將使用簡單的Onboarding過程。在這個例子中,我們將輸入數據。然后,如果經驗年數超過3,則將發布個性化入職歡迎消息的任務。在該任務中,用戶將手動將數據輸入到虛擬后端系統中。如果多年的經驗是3年或更短,那么簡單地,通用地,自動地將數據與虛擬后端系統集成。
Activiti的Process Engine符合BPMN 2.0標準。在視覺上,上面的過程可以這樣建模:
?
這個例子非常簡單。并且,根據要求,可以通過幾種不同的方式對其進行建模。雖然它也可以協調簡單的流程,但請注意,Activiti可以處理數十個,數百個甚至數千個步驟的非常復雜的流程。
上面的可視化過程模型的基礎是BPMN的XML結構。在這種情況下,XML文檔是onboarding.bpmn20.xml。這個快速入門不會深入到底層XML BPMN結構的深度,而是專注于針對Activiti API開發的機制以及將Activiti嵌入到您的應用程序中。然而,為了支持下面的邏輯,這里是相關BPMN形狀和基礎XML中編寫的定義邏輯的摘要:?
?
BPMN形狀 | Onboarding.bpmn20.xml行 | 注釋 |
8 | 開始活動 | |
9-15 | 用戶任務收集2個表單屬性:“fullName”和“yearsOfExperience”。請注意,第9行的候選組設置為“管理員”。 | |
21-27 | 用戶任務收集1表單屬性:“personalWelcomeTime”。請注意,第22行的候選組設置為“管理員”。 | |
31-35 | 腳本任務表示自動數據輸入到虛擬后端。請注意,雖然簡單,但有一個簡單的腳本可以設置一個過程變量autoWelcomeTime(第34-35行):var dateAsString = new Date().toString(); execution.setVariable("autoWelcomeTime", dateAsString); | |
18 | 定義“經驗歲月”專屬網關。(決定將產生一條或另一條路徑。) | |
37-39 | 使用yearsOfExperience變量表示“> 3”邏輯:${yearsOfExperience > 3} | |
18,36 | 在專用網關(第18行)上,注意指向“automatedIntroPath(第36行)”的默認節,表示條件“> 3”的邏輯“else”。 | |
298 | 結束事件 |
文件:$ mvnProject / src/ main / java / com / example / OnboardingRequest.java
添加行 | 說明 |
25-27 | 加載提供的BPMN模型并將其部署到Activiti Process Engine。 |
28-33 | 檢索已部署的模型,證明它位于Activiti存儲庫中。 |
有關BPMN及其在Activiti中的使用的更多信息,請參閱Activiti?用戶指南中的各個部分。
下載onboarding.bpmn20.xml文件,下面的整個XML結構,并將onboarding.bpmn20.xml文件復制到路徑$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
添加行 | 說明 |
25-27 | 加載提供的BPMN模型并將其部署到Activiti Process Engine。 |
28-33 | 檢索已部署的模型,證明它位于Activiti存儲庫中。 |
通過運行“mvn package”打包代碼。
像以前一樣運行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]
?
筆記:
- 這里感興趣的關鍵輸出是列表行,它記錄了進程名稱“Onboarding”和“onboarding:1:4”的唯一進程ID(包括部署版本)
您的應用程序現在在運行時部署Onboarding進程。
5.運行流程實例
?
部署的進程可以使用Activiti API來啟動,運行,查看歷史記錄以及以其他方式管理流程實例。此快速入門使用Java代碼運行流程實例。
有關使用Restful Services管理流程實例的示例,請參閱Sample Onboarding Quick Start。
將Activiti的日志記錄級別從DEBUG設置為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
?
重要提示:??以下示例代碼說明了Activiti基于標準的可嵌入流程引擎的靈活性和強大功能。但是,此代碼在錯誤處理,代碼組織和一般設計方面并不代表最佳實踐。相反,目的是快速說明許多想法,以便熟悉Activiti的力量。根據您自己的需要重新考慮以下示例。
添加到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
添加行 | 說明 |
12-13,17-21,28-39 | Activiti API中的主要服務導入用于流程管理。 |
54-59 | 啟動Onboarding進程的實例。 |
61-62,67,71-93 | 從符合“管理員”角色和完成任務的任務中收集命令行輸入。 |
23-25,76,80,84 | 基于流程模型中定義的表單屬性類型,提示用戶輸入特定于類型的輸入。 |
63,95-125 | 顯示過程歷史記錄。 |
23-25 | 檢索已部署的模型,證明它位于Activiti存儲庫中 |
通過運行“mvn package”打包代碼。
像以前一樣運行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年經驗在“經驗歲月”決定之后看到腳本任務“通用和自動數據輸入”之后的流程路徑,然后流程結束。
命令: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年經驗在“經驗歲月”決定之后看到用戶任務“個性化介紹和數據輸入”之后的流程路徑。然后過程結束。
雖然簡單,但這個嵌入式示例顯示了您的應用程序如何將流程邏輯外部化為基于標準的建模和代碼友好的開發模型。
6.用Java編寫服務任務
?
如前所述,我們的流程有一個活動“通用和自動數據輸入”(一種虛假的后端調用),當入門年經驗不超過3時,它有條件地運用。如所提供的,這是一個“腳本任務”。在這種情況下,執行了一小段Javascript,說明了系統處理步驟。我們將把這個腳本任務遷移到Java中,以說明Java的全部功能如何滿足各種流程要求。
創建一個新的Java類,如下所示:
文件:$ 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
添加行 | 說明 |
13 | 顯示設置過程變量。在這種情況下,變量autoWelcomeTime與當前時間。 |
14 | 顯示檢索流程變量。 |
將腳本任務更改為指向AutomatedDataDelegate的服務任務。
之前:
文件:$ 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>
?
通過運行“mvn package”打包代碼。
像以前一樣運行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]后端的虛假調用”,說明訪問先前設置的過程變量。
這個簡單的例子展示了在應用程序中添加流程驅動抽象的簡單性和強大功能。
7.結論
?
觀察輸出“[John Doe]后端的虛假調用”,說明訪問先前設置的過程變量。
源代碼:https://github.com/daqiang123/ActivitiDeveloperQuickStart.git
總結
以上是生活随笔為你收集整理的Activiti6快速入门指南的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言的爱你永不悔
- 下一篇: 我们应该这样理解鸿蒙