日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Flowable学习笔记(一、入门)

發(fā)布時間:2023/12/3 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Flowable学习笔记(一、入门) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉(zhuǎn)載自??Flowable學(xué)習(xí)筆記(一、入門)

一、Flowable簡介

?

1、Flowable是什么

Flowable是一個使用Java編寫的輕量級業(yè)務(wù)流程引擎。Flowable流程引擎可用于部署B(yǎng)PMN 2.0流程定義(用于定義流程的行業(yè)XML標(biāo)準(zhǔn)), 創(chuàng)建這些流程定義的流程實(shí)例,進(jìn)行查詢,訪問運(yùn)行中或歷史的流程實(shí)例與相關(guān)數(shù)據(jù),等等。這個章節(jié)將用一個可以在你自己的開發(fā)環(huán)境中使用的例子,逐步介紹各種概念與API。

Flowable可以十分靈活地加入你的應(yīng)用/服務(wù)/構(gòu)架。可以將JAR形式發(fā)布的Flowable庫加入應(yīng)用或服務(wù),來嵌入引擎。 以JAR形式發(fā)布使Flowable可以輕易加入任何Java環(huán)境:Java SE;Tomcat、Jetty或Spring之類的servlet容器;JBoss或WebSphere之類的Java EE服務(wù)器,等等。 另外,也可以使用Flowable REST API進(jìn)行HTTP調(diào)用。也有許多Flowable應(yīng)用(Flowable Modeler, Flowable Admin, Flowable IDM 與 Flowable Task),提供了直接可用的UI示例,可以使用流程與任務(wù)。

所有使用Flowable方法的共同點(diǎn)是核心引擎。核心引擎是一組服務(wù)的集合,并提供管理與執(zhí)行業(yè)務(wù)流程的API。 下面的教程從設(shè)置與使用核心引擎的介紹開始。后續(xù)章節(jié)都建立在之前章節(jié)中獲取的知識之上。

?

2、Flowable與Activiti

Flowable,2016年基于Activiti誕生。

?

二、開始

1、構(gòu)建命令行程序

我們將構(gòu)建的例子是一個簡單的請假(holiday request)流程:

  • 雇員(employee)申請幾天的假期
  • 經(jīng)理(manager)批準(zhǔn)或駁回申請
  • 我們會模擬將申請注冊到某個外部系統(tǒng),并給雇員發(fā)送結(jié)果郵件

?

1.1、創(chuàng)建流程引擎

1.1.1、創(chuàng)建maven項目

創(chuàng)建一個名為holiday-request的maven項目,添加依賴:

<!--Flowable流程引擎--><dependency><groupId>org.flowable</groupId><artifactId>flowable-engine</artifactId><version>6.3.0</version></dependency><!--MySQL驅(qū)動,這里采用MySQL數(shù)據(jù)庫,如果采用其它數(shù)據(jù)庫,需要引入對應(yīng)的依賴。--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.15</version></dependency>

?

1.1.2、創(chuàng)建數(shù)據(jù)庫表格

  • 創(chuàng)建一個數(shù)據(jù)庫flowable_demo。

  • 創(chuàng)建一個普通的Java類:HolidayRequest

/*** @Author 三分惡* @Date 2020/5/2* @Description 創(chuàng)建表格*/ public class HolidayRequest {public static void main(String[] args) {//1、創(chuàng)建ProcessEngineConfiguration實(shí)例,該實(shí)例可以配置與調(diào)整流程引擎的設(shè)置ProcessEngineConfiguration cfg=new StandaloneProcessEngineConfiguration()//2、通常采用xml配置文件創(chuàng)建ProcessEngineConfiguration,這里直接采用代碼的方式//3、配置數(shù)據(jù)庫相關(guān)參數(shù).setJdbcUrl("jdbc:mysql://localhost:3306/flowable_demo?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2b8&nullCatalogMeansCurrent=true").setJdbcUsername("root").setJdbcPassword("root").setJdbcDriver("com.mysql.jdbc.Driver").setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);//4、初始化ProcessEngine流程引擎實(shí)例ProcessEngine processEngine=cfg.buildProcessEngine();} }

?

1.1.3、運(yùn)行

運(yùn)行該類,會發(fā)現(xiàn)在數(shù)據(jù)庫flowable_demo中創(chuàng)建了34個表:


?

1.1.4、創(chuàng)建的表格說明

flowable命名規(guī)則:

  • ACT_RE_* :’ RE ’表示repository(存儲)。RepositoryService接口操作的表。帶此前綴的表包含的是靜態(tài)信息,如,流程定義,流程的資源(圖片,規(guī)則等)。
  • ACT_RU_* :’ RU ’表示runtime。這是運(yùn)行時的表存儲著流程變量,用戶任務(wù),變量,職責(zé)(job)等運(yùn)行時的數(shù)據(jù)。flowable只存儲實(shí)例執(zhí)行期間的運(yùn)行時數(shù)據(jù),當(dāng)流程實(shí)例結(jié)束時,將刪除這些記錄。這就保證了這些運(yùn)行時的表小且快。
  • ACT_ID_* : ’ ID ’表示identity(組織機(jī)構(gòu))。這些表包含標(biāo)識的信息,如用戶,用戶組,等等。
  • ACT_HI_* : ’ HI ’表示history。就是這些表包含著歷史的相關(guān)數(shù)據(jù),如結(jié)束的流程實(shí)例,變量,任務(wù),等等。
  • ACT_GE_* : 普通數(shù)據(jù),各種情況都使用的數(shù)據(jù)。

34張表說明:

表分類表名表說明
一般數(shù)據(jù)(2)ACT_GE_BYTEARRAY通用的流程定義和流程資源
ACT_GE_PROPERTY系統(tǒng)相關(guān)屬性
流程歷史記錄(8)ACT_HI_ACTINST歷史的流程實(shí)例
ACT_HI_ATTACHMENT歷史的流程附件
ACT_HI_COMMENT歷史的說明性信息
ACT_HI_DETAIL歷史的流程運(yùn)行中的細(xì)節(jié)信息
ACT_HI_IDENTITYLINK歷史的流程運(yùn)行過程中用戶關(guān)系
ACT_HI_PROCINST歷史的流程實(shí)例
ACT_HI_TASKINST歷史的任務(wù)實(shí)例
ACT_HI_VARINST歷史的流程運(yùn)行中的變量信息
用戶用戶組表(9)ACT_ID_BYTEARRAY二進(jìn)制數(shù)據(jù)表
ACT_ID_GROUP用戶組信息表
ACT_ID_INFO用戶信息詳情表
ACT_ID_MEMBERSHIP人與組關(guān)系表
ACT_ID_PRIV權(quán)限表
ACT_ID_PRIV_MAPPING用戶或組權(quán)限關(guān)系表
ACT_ID_PROPERTY屬性表
ACT_ID_TOKEN系統(tǒng)登錄日志表
ACT_ID_USER用戶表
流程定義表(3)ACT_RE_DEPLOYMENT部署單元信息
ACT_RE_MODEL模型信息
ACT_RE_PROCDEF已部署的流程定義
運(yùn)行實(shí)例表(10)ACT_RU_DEADLETTER_JOB正在運(yùn)行的任務(wù)表
ACT_RU_EVENT_SUBSCR運(yùn)行時事件
ACT_RU_EXECUTION運(yùn)行時流程執(zhí)行實(shí)例
ACT_RU_HISTORY_JOB歷史作業(yè)表
ACT_RU_IDENTITYLINK運(yùn)行時用戶關(guān)系信息
ACT_RU_JOB運(yùn)行時作業(yè)表
ACT_RU_SUSPENDED_JOB暫停作業(yè)表
ACT_RU_TASK運(yùn)行時任務(wù)表
ACT_RU_TIMER_JOB定時作業(yè)表
ACT_RU_VARIABLE運(yùn)行時變量表
其他表(2)ACT_EVT_LOG事件日志表
ACT_PROCDEF_INFO流程定義信息

?

1.1.4、日志配置

在上面的運(yùn)行中,同時可以看到,控制臺有報錯的信息,這是日志沒有正確地配置:

Flowable使用SLF4J作為內(nèi)部日志框架。我們使用log4j作為SLF4J的實(shí)現(xiàn)。因此在pom.xml文件中添加下列依賴:

<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>

?

在 src/resouce目錄下新建log4j的配置文件log4j.properties:

log4j.rootLogger=DEBUG, CAlog4j.appender.CA=org.apache.log4j.ConsoleAppender log4j.appender.CA.layout=org.apache.log4j.PatternLayout log4j.appender.CA.layout.ConversionPattern= %d{hh:mm:ss,SSS} [%t] %-5p %c %x - %m%n

?

再次運(yùn)行,可以看到關(guān)于引擎啟動與創(chuàng)建數(shù)據(jù)庫表結(jié)構(gòu)的提示日志:


?

1.2、部署流程定義

要構(gòu)建的流程是一個非常簡單的請假流程。Flowable引擎需要流程定義為BPMN 2.0格式,這是一個業(yè)界廣泛接受的XML標(biāo)準(zhǔn)。

在Flowable術(shù)語中,我們將其稱為一個流程定義(process definition)。一個流程定義可以啟動多個流程實(shí)例(process instance)。流程定義可以看做是重復(fù)執(zhí)行流程的藍(lán)圖。 在這個例子中,流程定義定義了請假的各個步驟,而一個流程實(shí)例對應(yīng)某個雇員提出的一個請假申請。

BPMN 2.0存儲為XML,并包含可視化的部分:使用標(biāo)準(zhǔn)方式定義了每個步驟類型(人工任務(wù),自動服務(wù)調(diào)用,等等)如何呈現(xiàn),以及如何互相連接。這樣BPMN 2.0標(biāo)準(zhǔn)使技術(shù)人員與業(yè)務(wù)人員能用雙方都能理解的方式交流業(yè)務(wù)流程。

我們要使用的流程定義為:


?

流程定義的說明:

  • 我們假定啟動流程需要提供一些信息,例如雇員名字、請假時長以及說明。當(dāng)然,這些可以單獨(dú)建模為流程中的第一步。 但是如果將它們作為流程的“輸入信息”,就能保證只有在實(shí)際請求時才會建立一個流程實(shí)例。否則(將提交作為流程的第一步),用戶可能在提交之前改變主意并取消,但流程實(shí)例已經(jīng)創(chuàng)建了。 在某些場景中,就可能影響重要的指標(biāo)(例如啟動了多少申請,但還未完成),取決于業(yè)務(wù)目標(biāo)。

  • 左側(cè)的圓圈叫做啟動事件(start event)。這是一個流程實(shí)例的起點(diǎn)。

  • 第一個矩形是一個用戶任務(wù)(user task)。這是流程中人類用戶操作的步驟。在這個例子中,經(jīng)理需要批準(zhǔn)或駁回申請。

  • 取決于經(jīng)理的決定,排他網(wǎng)關(guān)(exclusive gateway)?(帶叉的菱形)會將流程實(shí)例路由至批準(zhǔn)或駁回路徑。

  • 如果批準(zhǔn),則需要將申請注冊至某個外部系統(tǒng),并跟著另一個用戶任務(wù),將經(jīng)理的決定通知給申請人。當(dāng)然也可以改為發(fā)送郵件。

  • 如果駁回,則為雇員發(fā)送一封郵件通知他。

一般來說,這樣的流程定義使用可視化建模工具建立,如Flowable Designer(Eclipse)或Flowable Web Modeler(Web應(yīng)用)。

這里我們直接撰寫XML,以熟悉BPMN 2.0及其概念。

以下是與上面展示的流程圖對應(yīng)的BPMN 2.0 XML。這里只包含了“流程部分”。如果使用圖形化建模工具,實(shí)際的XML文件還將包含“可視化部分”,用于描述圖形信息,如流程定義中各個元素的坐標(biāo)(所有的圖形化信息包含在XML的BPMNDiagram標(biāo)簽中,作為definitions標(biāo)簽的子元素)。

在src/main/resources文件夾下創(chuàng)建為holiday-request.bpmn20.xml文件:

<?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: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"xmlns:flowable="http://flowable.org/bpmn"typeLanguage="http://www.w3.org/2001/XMLSchema"expressionLanguage="http://www.w3.org/1999/XPath"targetNamespace="http://www.flowable.org/processdef"><process id="holiday-request" name="Holiday Request" isExecutable="true"><!--開始事件:流程實(shí)例的起點(diǎn)--><startEvent id="startEvent"/><!--順序流:執(zhí)行時會從一個活動流向另一個活動--><sequenceFlow sourceRef="startEvent" targetRef="approveTask"/><!--用戶任務(wù):需要人工來進(jìn)行操作--><userTask id="approveTask" name="Approve or reject request"/><sequenceFlow sourceRef="approveTask" targetRef="decision"/><!--排他網(wǎng)關(guān)--><exclusiveGateway id="decision"/><sequenceFlow sourceRef="decision" targetRef="externalSystemCall"><!--順序流條件:以表達(dá)式(expression)的形式定義了條件(condition) --><conditionExpression xsi:type="tFormalExpression"><!--條件表達(dá)式:是${approved == true}的簡寫--><![CDATA[${approved}]]></conditionExpression></sequenceFlow><sequenceFlow sourceRef="decision" targetRef="sendRejectionMail"><conditionExpression xsi:type="tFormalExpression"><![CDATA[${!approved}]]></conditionExpression></sequenceFlow><!--服務(wù)任務(wù),一個自動活動,它會調(diào)用一些服務(wù)--><serviceTask id="externalSystemCall" name="Enter holidays in external system" flowable:class="edu.hpu.process.CallExternalSystemDelegate"/><userTask id="holidayApprovedTask" name="Holiday Approve!"/><sequenceFlow sourceRef="holidayApprovedTask" targetRef="approveEnd"/><serviceTask id="sendRejectionMail" name="Send out rejection email" flowable:class="edu.hpu.process.SendRejectionMail"/><sequenceFlow sourceRef="sendRejectionMail" targetRef="rejectEnd"/><!--結(jié)束事件--><endEvent id="approveEnd"/><endEvent id="rejectEnd"/></process></definitions>

?

  • 每一個步驟(在BPMN 2.0術(shù)語中稱作活動(activity))都有一個id屬性,為其提供一個在XML文件中唯一的標(biāo)識符。所有的活動都可以設(shè)置一個名字,以提高流程圖的可讀性。

  • 活動之間通過順序流(sequence flow)連接,在流程圖中是一個有向箭頭。在執(zhí)行流程實(shí)例時,執(zhí)行(execution)會從啟動事件沿著順序流流向下一個活動。

  • 離開排他網(wǎng)關(guān)(帶有X的菱形)的順序流很特別:都以表達(dá)式(expression)的形式定義了條件(condition) 。當(dāng)流程實(shí)例的執(zhí)行到達(dá)這個網(wǎng)關(guān)時,會計算條件,并使用第一個計算為true的順序流。這就是排他的含義:只選擇一個。當(dāng)然如果需要不同的路由策略,可以使用其他類型的網(wǎng)關(guān)。

  • 這里用作條件的表達(dá)式為approved,這是approved,這是{approved == true}的簡寫。變量’approved’被稱作流程變量(process variable)。流程變量是持久化的數(shù)據(jù),與流程實(shí)例存儲在一起,并可以在流程實(shí)例的生命周期中使用。在這個例子里,我們需要在特定的地方(當(dāng)經(jīng)理用戶任務(wù)提交時,或者以Flowable的術(shù)語來說,完成(complete)時)設(shè)置這個流程變量,因?yàn)檫@不是流程實(shí)例啟動時就能獲取的數(shù)據(jù)。

現(xiàn)在我們已經(jīng)有了流程BPMN 2.0 XML文件,下來需要將它部署(deploy)到引擎中。部署一個流程定義意味著:

  • 流程引擎會將XML文件存儲在數(shù)據(jù)庫中,這樣可以在需要的時候獲取它。

  • 流程定義轉(zhuǎn)換為內(nèi)部的、可執(zhí)行的對象模型,這樣使用它就可以啟動流程實(shí)例。

將流程定義部署至Flowable引擎,需要使用RepositoryService,其可以從ProcessEngine對象獲取。使用RepositoryService,可以通過XML文件的路徑創(chuàng)建一個新的部署(Deployment),并調(diào)用deploy()方法實(shí)際執(zhí)行:

//創(chuàng)建RepositoryService實(shí)例RepositoryService repositoryService=processEngine.getRepositoryService();//加載流程Deployment deployment=repositoryService.createDeployment().addClasspathResource("holiday-request.bpmn20.xml").deploy();

?

我們現(xiàn)在可以通過API查詢驗(yàn)證已經(jīng)部署在引擎中的流程定義。通過RepositoryService創(chuàng)建的ProcessDefinitionQuery對象實(shí)現(xiàn)。

//查詢流程定義ProcessDefinition processDefinition=repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).singleResult();System.out.println("Found process definition : "+processDefinition.getName());

運(yùn)行:

xml文件已經(jīng)存儲進(jìn)了數(shù)據(jù)庫:

?

1.3、啟動流程實(shí)例

現(xiàn)在已經(jīng)在流程引擎中部署了流程定義,因此可以使用這個流程定義作為“藍(lán)圖”啟動流程實(shí)例。

  • 要啟動流程實(shí)例,需要提供一些初始化流程變量。一般來說,可以通過呈現(xiàn)給用戶的表單,或者在流程由其他系統(tǒng)自動觸發(fā)時通過REST API,來獲取這些變量。在這個例子里,我們簡化為使用java.util.Scanner類在命令行輸入一些數(shù)據(jù):
//1、獲取流程初始化變量Scanner scanner = new Scanner(System.in);System.out.println("Who are you?");String employee = scanner.nextLine();System.out.println("How many holidays do you want to request?");Integer nrOfHolidays = Integer.valueOf(scanner.nextLine());System.out.println("Why do you need them?");String description = scanner.nextLine();
  • 接下來,我們使用RuntimeService啟動一個流程實(shí)例。收集的數(shù)據(jù)作為一個java.util.Map實(shí)例傳遞,其中的鍵就是之后用于獲取變量的標(biāo)識符。這個流程實(shí)例使用key啟動(還有其它方式)。這個key就是BPMN 2.0 XML文件中設(shè)置的id屬性,在這個例子里是holiday-request。
<process id="holiday-request" name="Holiday Request" isExecutable="true"> //2、使用RuntimeService啟動一個流程實(shí)例RuntimeService runtimeService=processEngine.getRuntimeService();Map<String, Object> variables = new HashMap<String, Object>();variables.put("employee", employee);variables.put("nrOfHolidays", nrOfHolidays);variables.put("description", description);ProcessInstance processInstance=runtimeService.startProcessInstanceByKey("holiday-request",variables);

在流程實(shí)例啟動后,會創(chuàng)建一個執(zhí)行(execution),并將其放在啟動事件上。從這里開始,這個執(zhí)行會沿著順序流移動到經(jīng)理審批的用戶任務(wù),并執(zhí)行用戶任務(wù)行為。這個行為將在數(shù)據(jù)庫中創(chuàng)建一個任務(wù),該任務(wù)可以之后使用查詢找到。用戶任務(wù)是一個等待狀態(tài)(wait state),引擎會停止執(zhí)行,返回API調(diào)用處。

輸入流程初始化變量:

將數(shù)據(jù)插入數(shù)據(jù)庫中


?

向數(shù)據(jù)庫中插入了數(shù)據(jù):

?

1.4、Flowable中的事務(wù)

在Flowable中,數(shù)據(jù)庫事務(wù)扮演了關(guān)鍵角色,用于保證數(shù)據(jù)一致性,并解決并發(fā)問題。當(dāng)調(diào)用Flowable API時,默認(rèn)情況下,所有操作都是同步的,并處于同一個事務(wù)下。這意味著,當(dāng)方法調(diào)用返回時,會啟動并提交一個事務(wù)。

流程啟動后,會有一個數(shù)據(jù)庫事務(wù)從流程實(shí)例啟動時持續(xù)到下一個等待狀態(tài)。在這個例子里,指的是第一個用戶任務(wù)。當(dāng)引擎到達(dá)這個用戶任務(wù)時,狀態(tài)會持久化至數(shù)據(jù)庫,提交事務(wù),并返回API調(diào)用處。

在Flowable中,當(dāng)一個流程實(shí)例運(yùn)行時,總會有一個數(shù)據(jù)庫事務(wù)從前一個等待狀態(tài)持續(xù)到下一個等待狀態(tài)。數(shù)據(jù)持久化之后,可能在數(shù)據(jù)庫中保存很長時間,甚至幾年,直到某個API調(diào)用使流程實(shí)例繼續(xù)執(zhí)行。請注意當(dāng)流程處在等待狀態(tài)時,不會消耗任何計算或內(nèi)存資源,直到下一次APi調(diào)用。

在這個例子中,當(dāng)?shù)谝粋€用戶任務(wù)完成時,會啟動一個數(shù)據(jù)庫事務(wù),從用戶任務(wù)開始,經(jīng)過排他網(wǎng)關(guān)(自動邏輯),直到第二個用戶任務(wù)?;蛲ㄟ^另一條路徑直接到達(dá)結(jié)束。

?

1.5、查詢與完成任務(wù)

在更實(shí)際的應(yīng)用中,會為雇員及經(jīng)理提供用戶界面,讓他們可以登錄并查看任務(wù)列表。其中可以看到作為流程變量存儲的流程實(shí)例數(shù)據(jù),并決定如何操作任務(wù)。在這個例子中,我們通過執(zhí)行API調(diào)用來模擬任務(wù)列表,通常這些API都是由UI驅(qū)動的服務(wù)在后臺調(diào)用的。

我們還沒有為用戶任務(wù)配置辦理人。

  • 將第一個任務(wù)指派給"經(jīng)理(managers)"組,而第二個用戶任務(wù)指派給請假申請的提交人。
<!--將任務(wù)指派給經(jīng)理組--><userTask id="approveTask" name="Approve or reject request" flowable:candidateGroups="managers"/> <!--指派給請假審批的審批人,${employee}使用流程變量動態(tài)指派,在流程實(shí)例啟動時傳遞--><userTask id="holidayApprovedTask" name="Holiday Approve!" flowable:assignee="${employee}"/>

?

  • 要獲得實(shí)際的任務(wù)列表,需要通過TaskService創(chuàng)建一個TaskQuery。這個查詢配置為只返回’managers’組的任務(wù):
//通過TaskService查詢 manager 組的任務(wù)TaskService taskService=processEngine.getTaskService();List<Task> tasks=taskService.createTaskQuery().taskCandidateGroup("managers").list();System.out.println("You have " + tasks.size() + " tasks:");for (int i=0; i<tasks.size(); i++) {System.out.println((i+1) + ") " + tasks.get(i).getName());}

?

  • 使用集合下標(biāo)獲取特定流程實(shí)例的變量,在控制臺輸出
//使用集合下標(biāo)獲取特定流程實(shí)例的變量,在控制臺輸出System.out.println("Which task would you like to complete?");int taskIndex = Integer.valueOf(scanner.nextLine());Task task=tasks.get(taskIndex-1);Map<String,Object> processVariables=taskService.getVariables(task.getId());System.out.println(processVariables.get("employee") + " wants " +processVariables.get("nrOfHolidays") + " of holidays. Do you approve this?");

?

  • 經(jīng)理現(xiàn)在就可以完成任務(wù)了。在實(shí)際開發(fā)中,通常由用戶提交一個表單。表單中的數(shù)據(jù)作為流程變量傳遞。在這里,我們在完成任務(wù)時傳遞帶有’approved’變量(這個名字很重要,因?yàn)橹髸陧樞蛄鞯臈l件中使用)的map來模擬:
//經(jīng)理完成任務(wù)boolean approved=scanner.nextLine().toLowerCase().equals("y");variables = new HashMap<String, Object>();variables.put("approved", approved);//任務(wù)完成,并會在離開排他網(wǎng)關(guān)的兩條路徑中,基于’approved ’流程變量選擇一條taskService.complete(task.getId(),variables);

現(xiàn)在還缺最后一點(diǎn),服務(wù)任務(wù)調(diào)用的服務(wù)沒有實(shí)現(xiàn):

<!--服務(wù)任務(wù),一個自動活動,它會調(diào)用一些服務(wù)--><serviceTask id="externalSystemCall" name="Enter holidays in external system" flowable:class="edu.hpu.process.CallExternalSystemDelegate"/>
  • 創(chuàng)建一個類,實(shí)現(xiàn)JavaDelegate接口,實(shí)現(xiàn)execute方法,這個方法可以寫很多業(yè)務(wù)邏輯,這里我們只是是在控制臺打印輸出一些內(nèi)容:
/*** @Author 三分惡* @Date 2020/5/3* @Description*/ public class CallExternalSystemDelegate implements JavaDelegate {public void execute(DelegateExecution delegateExecution) {System.out.println("Calling the external system for employee "+ delegateExecution.getVariable("employee"));} }

運(yùn)行:

啟動流程:


?

  • 查看任務(wù)

  • 完成任務(wù)

  • 執(zhí)行自動邏輯

至此,一個模擬請假流程就完成了。

?

1.6、使用歷史數(shù)據(jù)

選擇使用Flowable這樣的流程引擎的原因之一,是它可以自動存儲所有流程實(shí)例的審計數(shù)據(jù)或歷史數(shù)據(jù)。這些數(shù)據(jù)可以用于創(chuàng)建報告,深入展現(xiàn)組織運(yùn)行的情況,瓶頸在哪里,等等。

從ProcessEngine獲取HistoryService,并創(chuàng)建歷史活動(historical activities)的查詢。

//獲取HistoryService實(shí)例HistoryService historyService=processEngine.getHistoryService();//添加查詢條件List<HistoricActivityInstance> activities =historyService.createHistoricActivityInstanceQuery()//選擇特定實(shí)例.processInstanceId(processInstance.getId())//選擇已完成的.finished()//根據(jù)實(shí)例完成時間升序排列.orderByHistoricActivityInstanceEndTime().asc().list();for (HistoricActivityInstance activity : activities) {System.out.println(activity.getActivityId() + " took "+ activity.getDurationInMillis() + " milliseconds");}


?

參考:

【1】:Flowable BPMN 用戶手冊 (v 6.3.0)
【2】:flowable學(xué)習(xí)(Ⅰ) --- 創(chuàng)建一個簡單的flowable流程例子
【3】:activiti與flowable的區(qū)別
【4】:Flowable數(shù)據(jù)庫表說明
【5】:基于BPMN2.0的工作流(Workflow)
【6】:BPMN 2.0 / Flowable
【7】:BPMN 2.0規(guī)范
【8】:第 3 章 BPMN 2.0

總結(jié)

以上是生活随笔為你收集整理的Flowable学习笔记(一、入门)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。