當部署流程定義時,資料庫中的流程定義會是這個樣子:
idkey
name
version
myprocess:1:676
myprocess
my important process
1如果我們現在部署同乙個流程的更新版本(例如修改部分使用者任務),且保持流程定義的id不變,那麼流程定義表中會包含下面的記錄:
idkey
name
version
myprocess:1:676
myprocess
my important process
1myprocess:2:870
myprocess
my important process
2當呼叫執行流程時,會使用版本2的流程定義,因為這是這個流程定義的最新版本。
比如在resources/下新建資源檔案single-task.bpmn20.xml
<?xml version="1.0" encoding="utf-8"?>
部署示例**:
// 資源路徑
string path = "single-task.bpmn20.xml";
// 建立部署構建器
deploymentbuilder deploymentbuilder = repositoryservice.createdeployment();
// 新增資源
deploymentbuilder.addclasspathresource(path);
// 執行部署
deploymentbuilder.deploy();
// 驗證部署
long count = repositoryservice.createprocessdefinitionquery().processdefinitionkey("singletask").count();
// count等於1,則說明部署成功
只要是在專案class目錄下的資源,都可以用這種方式部署。
這種方式一般用於開發測試階段,真正的生產環境,是通過與web管理頁面互動部署。
在springboot環境下,resources/processes目錄下的任何bpmn 2.0流程定義都會被自動部署。
實際生產中,我們需要接收前端傳回來的流程定義資料,然後更新部署。
下面我們省去前端訪問介面引數的展示,僅演示後端處理**。
// 從前端接收到的xml字串
// 此處省去xml具體內容,可參考2.1的single-task.bpmn20.xml示例
// 注意將id定義為singletask2,以便跟2.1的內容作出區別
string text = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
// 建立部署構建器
deploymentbuilder deploymentbuilder = repositoryservice.createdeployment();
// 執行部署
deploymentbuilder.addstring("single-task2.bpmn20.xml", text).deploy();
// 驗證部署
long count = repositoryservice.createprocessdefinitionquery().processdefinitionkey("singletask2").count();
// count等於1,則說明部署成功
當我們需要一次同時部署多個資源時,可以通過zip壓縮包的部署方式。
string filename = "path/multi-task.zip";
zipinputstream inputstream = new zipinputstream(new fileinputstream(filename));
repositoryservice.createdeployment()
.name("multi-task.zip")
.addzipinputstream(inputstream)
.deploy();
補充:流程定義檔案,需要由流程設計器生成。整合流程設計器,可參考:業務系統的第一步,就是需要乙個列表可以瀏覽和管理流程定義。
@autowired
private repositoryservice repositoryservice;
public list getdeploylist()
顯然,管理頁面需要顯示流程的功能。
flowable引擎會在流程部署時,自動生成流程。
processdefinition processdefinition = repositoryservice.createprocessdefinitionquery()
.processdefinitionkey("singletask")
.singleresult();
string diagramresourcename = processdefinition.getdiagramresourcename();
inputstream imagestream = repositoryservice.getresourceasstream(
processdefinition.getdeploymentid(), diagramresourcename);
注意:如果不需要或不希望在部署時生成流程圖,可以在流程引擎配置中設定iscreatediagramondeploy引數:管理介面可增加「顯示流程定義**」功能,即讀取顯示流程定義的xml內容。
// 根據processdefinitionid查詢
processdefinition pd = repositoryservice.createprocessdefinitionquery().processdefinitionid(processdefinitionid).singleresult();
// 讀取資源流,resourcename為前端傳回的資源名稱
inputstream stream = repositoryservice.getresourceasstream(pd.getdeploymentid(), resourcename);
//讀取到的資源流再返回到前端
乙個流程定義不是通過流程定義id刪除,而是通過流程定義的部署id刪除。在執行刪除時,會將和本次部署有關的資源一起刪除。
repositoryservice.deletedeployment(deploymentid, true);
本篇介紹了流程定義的版本、部署及管理的使用方法。當然,在實際應用中,還有很多細節需要優化,比如流程定義部署時的去重,分頁獲取流程列表等等。 三 流程控制語句
通過流程控制語句,可以改變程式的執行順序,也可以讓指定的程式反覆執行多次。分類 if 條件表示式 語句if 條件表示式 塊if else語句 if 條件表示式 塊else 塊 if elif else語句 if 條件表示式 塊elif 條件表示式 塊elif 條件表示式 塊else 塊 塊 塊中儲存...
flowable 從zip壓縮包 部署流程定義
部署流程定義 從zip壓縮包 param name 部署名稱 param zippath zip檔案路徑 return 部署id from fhadmin.cn protected string deploymentprocessdefinitionfromzip string name,strin...
go語言(三)流程控制,函式
一 if語句 if 語句沒有圓括號,而必需要有花括號跟條件和 else在同一行 例 if myvar 1 else if的條件中可以新增一句初始化語句,用 分隔 if c 1 myvar 1 此變數c的作用域是在後面的 內的。外面是不可見,同時如果不在後面使用也是會編譯錯誤的。二 switch語句 ...