
業務文檔
- 為了部署流程,需要包裝在一個業務文檔中
- 一個業務文檔是Activiti引擎部署的單元
- 一個業務文檔相當與一個壓縮文件,它包含:
- BPMN2.0流程
- 任務表單
- 規則
- 其他任意類型的文件
- 業務文檔是包含命名資源的容器
- 當一個業務文檔被部署,它將會自動掃描以.bpmn20.xml或者.bpmn作為擴展名的BPMN文件.每個那樣的文件都將會被解析並且可能會包含多個流程定義
業務歸檔中的Java類將不能夠添加到類路徑下
為了能夠讓流程運行,必須把存在於業務歸檔程中的流程定義使用的所有自定義的類(例如:Java服務任務或者實現事件的監聽器)放在 [activiti引擎的類路徑] 下
編程式部署
- 通過一個壓縮文件(支持Zip和Bar)部署業務文檔
- 也可以通過一個獨立資源(例如bpmn,xml等)構建部署
String barFileName = "path/to/process-one.bar";
ZipInputStream inputStream = new ZipInputStream(new FileInputStream(barFileName));
repositoryService.createDeployment()
.name("process-one.bar")
.addZipInputStream(inputStream)
.deploy();
通過Activiti Explorer控制台部署
- Activiti web控制台允許你通過web界面的用戶接口上傳一個bar格式的壓縮文件(或者一個bpmn20.xml格式的文件).選擇Management 標簽和點擊Deployment:

外部資源
- 流程定義保存在Activiti所支持的數據庫中
- 當使用服務任務,執行監聽器
- 從Activiti配置文件中配置的Spring beans時,流程定義能夠引用這些委托類.
- 這些類或者Spring配置文件對於所有流程引擎中可能執行的流程定義必須是可用的
Java類
- 當流程實例被啟動的時候,在流程中被使用的所有自定義類應該存在流程引擎的類路徑下:
- 服務任務中:
- JavaDelegates
- 事件監聽器
- 任務監聽器
- 在部署業務文檔時,這些類不必都存在於類路徑下.當使用Ant部署一個新的業務文檔時,意味着你的委托類不必存在類路徑下
- 當使用示例設置添加自定義類:
- 應該添加包含自定義類的jar包到activiti-explorer控制台
- activiti-rest的webapp lib文件夾中
- 不要忽略包含你自定義類的依賴關系
- 還可以將你自定義的依賴添加到你的Tomcat容器的安裝目錄中的${tomcat.home}/lib
流程中使用Spring beans
- 當表達式或者腳本使用Spring beans時,這些beans對於引擎執行流程定義時必須是可用的
- 如果要構建自定義的web應用並且按照Spring集成在應用上下文配置流程引擎.要記住,如果在使用Activiti rest web應用,那么也應該更新Activiti rest web應用的上下文.可以把在activiti-rest/lib/activiti-cfg.jar文件中的activiti.cfg.xml替換成的Spring上下文配置的activiti-context.xml文件
創建獨立應用
- 可以將Activiti rest web應用加入到web應用之中,只需要配置一個 ProcessEngine,
- 從而不用確保所有的流程引擎的所有委托類在類路徑下面並且是否使用正確的spring配置
流程定義的版本
- BPMN中並沒有版本的概念,而在Activiti中,流程定義的版本會在部署時創建,在部署的時候,流程定義被存儲到Activiti使用的數據庫之前,Activiti將會自動給流程定義分配一個版本號
- 業務文檔中每一個的流程定義,都會通過下列部署執行初始化屬性key,version,name和id:
- XML文件中流程定義(流程模型)的id屬性被當做是流程定義的key屬性
- XML文件中的流程模型的name屬性被當做是流程定義的name 屬性.如果該name屬性沒有指定,那么id屬性被當作是name屬性
- 帶有特定key的流程定義在第一次部署的時候,將會自動分配版本號為1,對於之后部署相同key的流程定義時候,這次部署的版本號將會設置為比當前最大的版本號大1的值.該key屬性被用來區別不同的流程定義
- 流程定義中的id屬性被設置為 {processDefinitionKey}:{processDefinitionVersion}:{generated-id}, 這里的generated-id是一個唯一的數字被添加, 用於確保在集群環境中緩存的流程定義的唯一性
<definitions id="myDefinitions" >
<process id="myProcess" name="My important process" >
...
當部署了這個流程定義之后,數據庫中的流程定義如下:
id |
key |
name |
version |
myProcess:1:676 |
myProcess |
My important process |
1 |
- 假設部署用一個流程的最新版本號(改變用戶任務),但是流程定義的id保持不變.流程定義表將包含以下列表信息:
id |
key |
name |
version |
myProcess:1:676 |
myProcess |
My important process |
1 |
myProcess:2:870 |
myProcess |
My important process |
2 |
當runtimeService.startProcessInstanceByKey("myProcess") 方法被調用時,它將會使用流程定義版本號為2的, 因為這是最新版本的流程定義.可以說每次流程定義創建流程實例時,都會默認使用最新版本的流程定義
- 創建第二個流程,在Activiti中,定義並且部署它,該流程定義會添加到流程定義表中:
<definitions id="myNewDefinitions" >
<process id="myNewProcess" name="My important process" >
...
id |
key |
name |
version |
myProcess:1:676 |
myProcess |
My important process |
1 |
myProcess:2:870 |
myProcess |
My important process |
2 |
myNewProcess:1:1033 |
myNewProcess |
My important process |
1 |
- 注意: 新流程的key與我們的第一個流程是不同的,盡管流程定義的名稱name是相同的(當然,名稱name也可以是不相同的),Activiti僅僅只考慮id屬性判斷流程. 因此,新的流程定義部署的版本號為1
提供流程圖片
- 流程定義的流程圖可以被添加到部署中,該流程圖將會持久化到Activiti所使用的數據庫中並且可以通過Activiti的API進行訪問.
- 流程圖也可以被用來在Activiti Explorer控制台中的流程中進行顯示
- 如果在我們的類路徑下面有一個流程:org/activiti/expenseProcess.bpmn20.xml, 該流程定義有一個流程key=expense. 以下遵循流程定義圖片的命名規范(按照這個特定順序):
- 如果在部署時一個圖片資源已經存在,是BPMN2.0的XML文件名,后面是流程定義的key並且是一個圖片的后綴.那么該圖片將被使用.
- 應該是org/activiti/expenseProcess.expense.png(或者jpg/gif).如果在一個BPMN2.0 XML文件中定義多個流程定義圖片,這種方式更有意義.每個流程定義圖片的文件名中都將會有一個流程定義key
- 如果並沒有這樣的圖片存在,部署的時候尋找與匹配BPMN2.0 XML文件的名稱的圖片資源
- 應該是org/activiti/expenseProcess.png.注意:這意味着在同一個BPMN2.0 XML文件夾中的每個流程定義都會有相同的流程定義圖片.因此,在每一個BPMN 2.0 XML文件夾中僅僅只有一個流程定義,這絕對是不會有問題的
- 使用編程式的部署方式:
repositoryService.createDeployment()
.name("expense-process.bar")
.addClasspathResource("org/activiti/expenseProcess.bpmn20.xml")
.addClasspathResource("org/activiti/expenseProcess.png")
.deploy();
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
.processDefinitionKey("expense")
.singleResult();
String diagramResourceName = processDefinition.getDiagramResourceName();
InputStream imageStream = repositoryService.getResourceAsStream(processDefinition.getDeploymentId(), diagramResourceName);
自動生成流程圖片
- 在部署的情況下沒有提供圖片,如果流程定義中包含必要的'圖像交換'信息時,Activiti流程引擎會自動生成一個圖像
- 該資源可以按照上面部署時提供流程圖片完全相同的方式獲取:

- 如果因為某種原因,在部署的時候,並不需要或者不必要生成流程定義圖片,那么就需要在流程引擎配置的屬性中使用isCreateDiagramOnDeploy進行配置就可以不生成流程定義圖片:
<property name="createDiagramOnDeploy" value="false" />
類別
- 部署和流程定義都是用戶定義的類別
- 流程定義類別在BPMN文件中屬性的初始化的值:
<definitions ... targetNamespace="yourCategory" ... />
repositoryService
.createDeployment()
.category("yourCategory")
...
.deploy();