Flowable實戰(三)流程部署管理

2022-09-10 18:45:13 字數 3539 閱讀 1565

當部署流程定義時,資料庫中的流程定義會是這個樣子:

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語句 ...