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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

activiti工作流简介

發(fā)布時間:2023/12/14 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 activiti工作流简介 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?

工作流簡介

工作流定義

工作流:

? ? 就是“業(yè)務(wù)過程的部分或整體在計算機應(yīng)用環(huán)境下的自動化”,它主要解決的是“使在多個參與者之間按照某種預定義的規(guī)則傳遞文檔、信息或任務(wù)的過程自動進行,從而實現(xiàn)某個預期的業(yè)務(wù)目標,或者促使此目標的實現(xiàn)”。

工作流管理系統(tǒng)(Workflow Management System, WfMS):

? ? 工作流管理系統(tǒng)是一個軟件系統(tǒng),它完成工作量的定義和管理,并按照在系統(tǒng)中預先定義好的工作流規(guī)則進行工作流實例的執(zhí)行。工作流管理系統(tǒng)不是企業(yè)的業(yè)務(wù)系統(tǒng),而是為企業(yè)的業(yè)務(wù)系統(tǒng)的運行提供了一個軟件的支撐環(huán)境。

? ? 主要工作:

? ? 1、定義工作流:包括具體的活動、規(guī)則等。

? ? 2、執(zhí)行工作流:按照流程定義的規(guī)則執(zhí)行,并由多個參與者進行控制。

工作流特點

采用工作流有以下優(yōu)點:

? ? 1、提高系統(tǒng)的柔性,適應(yīng)業(yè)務(wù)流程的變化?

? ? 2、實現(xiàn)更好的業(yè)務(wù)過程控制,提高顧客服務(wù)質(zhì)量

? ? 3、降低系統(tǒng)開發(fā)和維護成本

常見工作流:Activiti、JBPM、OSWorkflow、ActiveBPEL、YAWL等。

activiti工作流

activiti簡介

Activiti5是由Alfresco軟件在2010年5月17日發(fā)布的業(yè)務(wù)流程管理(BPM)框架,它是覆蓋了業(yè)務(wù)流程管理、工作流、服務(wù)協(xié)作等領(lǐng)域的一個開源的、靈活的、易擴展的可執(zhí)行流程語言框架。

Activiti基于Apache許可的開源BPM平臺,創(chuàng)始人Tom Baeyens是JBoss Activiti的項目架構(gòu)師。

工作流引擎

ProcessEngine對象是Activiti工作的核心。負責生成流程運行時的各種實例及數(shù)據(jù)、監(jiān)控和管理流程的運行,其他的類都是由他而來。

產(chǎn)生方式:

首先需要先創(chuàng)建Activiti配置對象的實例ProcessEngineConfiguration,里面主要配置相關(guān)數(shù)據(jù)源參數(shù),支持基于配置文件和注解的創(chuàng)建。

?

然后通過ProcessEngineConfiguration創(chuàng)建工作流引擎,舉例如下(這里列舉基于spring的SpringProcessEngineConfiguration作為ProcessEngineConfigurationImpl的配置實現(xiàn)):

ProcessEngine processEngine =? springProcessEngineConfiguration.buildProcessEngine();

ProcessEngine 可以產(chǎn)生RepositoryService、RuntimeService、TaskService等服務(wù)類。舉例如下:

RepositoryService repositoryService =? processEngine.getRepositoryService();

各個Service的作用:

RepositoryService

管理流程定義

RuntimeService

執(zhí)行管理,包括啟動、推進、刪除流程實例等操作

TaskService

任務(wù)管理

HistoryService

歷史管理(執(zhí)行完的數(shù)據(jù)的管理)

IdentityService

組織機構(gòu)管理

FormService

一個可選服務(wù),任務(wù)表單管理

ManagerService

?

?

RepositoryService

? ??RepositoryService是Activiti的倉庫服務(wù)類,用于定義、部署和配置流程。

RuntimeService

? ??RuntimeService是activiti的流程執(zhí)行服務(wù)類。可以從這個服務(wù)類中獲取很多關(guān)于正在執(zhí)行的流程相關(guān)的信息。

TaskService

? ??TaskService是activiti的流程任務(wù)服務(wù)類??梢詮倪@個類中獲取任務(wù)的信息。

HistoryService

? ??HistoryService是activiti的查詢歷史信息的類。在一個流程執(zhí)行完成后,這個對象為我們提供查詢歷史信息。

Deployment

? ??部署對象,用于部署流程定義文件(bpmn、png等文件),也可對流程進行修改和刪除。

ProcessDefinition

? ??流程定義類,解析.bpmn后得到的流程定義規(guī)則的信息,工作流系統(tǒng)就是按照流程定義的規(guī)則執(zhí)行的,通常用于查詢部署的流程定義和資源。

ProcessInstance

? ??ProcessInstance代表流程定義的執(zhí)行實例。如A請了一天的假,他就必須發(fā)出一個流程實例的申請。一個流程實例包括了所有的運行節(jié)點。我們可以利用這個對象來了解當前流程實例的進度等信息。

流程實例就表示一個流程從開始到結(jié)束的最大的流程分支,即一個流程中流程實例只有一個。

Execution

? ??執(zhí)行對象。Activiti用這個對象去描述流程執(zhí)行的每一個節(jié)點。一個流程中,執(zhí)行對象可以存在多個,但是流程實例只能有一個。在單線流程中,Execution就是同ProcessInstance,在多線流程中,分線路中每個活動代表Execution。如下圖的示例:

BPMN

activiti基于BPMN規(guī)范引入了很多組件,下面列出一些常用的組件模塊。

start事件

首先解釋一下事件:事件用于對發(fā)生在流程生命周期的事情進行建模。事件總是被形象成一個圓圈。在 BPMN 2.0 中,存在兩種主要的事件類型:捕獲事件和拋出事件。

? ? ? ?捕獲:流程執(zhí)行到該事件時,會等待事件觸發(fā)。事件觸發(fā)類型由內(nèi)部圖標或 XML 中的類型聲明來定義。捕獲事件視覺上可以通過里面沒有填充的內(nèi)部圖標與拋出事件進行區(qū)分(也就是說,圖標是白色的)。
? ? ? ?拋出:流程執(zhí)行到該事件時,事件就會被觸發(fā)。該事件觸發(fā)的類型由內(nèi)部圖標或 XML 中的類型聲明來定義。拋出事件視覺上可以通過內(nèi)部圖標與拋出的事件進行區(qū)分,拋出事件的圖標使用黑色填充。

start 事件表示流程的開始。定義了流程如何被啟動的 start 事件類型。start 事件總是捕獲型的,start事件通常包括,none start事件和timer start事件。

none start事件不需要觸發(fā)器就能發(fā)生,一般通過調(diào)用 startProcessInstanceByXXX 方法啟動流程實例的時候觸發(fā)。none start 事件被形象化成不帶內(nèi)圖標的圓(即,沒有觸發(fā)器類型)。如下圖:

XML表示:

<startEvent id="start" name="my start event" />

?

timer start 事件用于在給定的時間點創(chuàng)建流程實例。它可以用在只啟動一次的流程中,也可以用在特定時間間隔下啟動的流程。其圖標被形象話為有表的內(nèi)圖標的圓,如下圖:

XML表示(示例為從2017年3月11日12:13開始,流程將啟動4次每次間隔5分鐘):

<startEvent id="theStart"> <timerEventDefinition> <timeCycle>R4/2017-03-11T12:13/PT5M</timeCycle> </timerEventDefinition> </startEvent>

end事件

結(jié)束事件表明流程或子流程(執(zhí)行路徑)的結(jié)束。結(jié)束事件總是拋出型的。這意味著當流程執(zhí)行到結(jié)束事件時,有一個結(jié)果會被拋出。結(jié)果的類型是以事件的內(nèi)部黑色圖標來表示的。end事件包括None end事件和error end事件。none end即正常結(jié)束事件。error end事件當流程執(zhí)行到error end事件時,會結(jié)束當前的執(zhí)行路徑,并拋出 error。Error可以被與之匹配的中間邊界error事件捕獲。如果沒有找到匹配的邊界error事件,默認會使用none end事件。如下圖是none end事件:

XML表示:

<endEvent id="end" name="my end event" />

順序流(sequence flow)

順序流是兩個流程元素的連接器。一個元素在流程執(zhí)行期間被訪問后,流程會沿著該元素所有輸出的順序流繼續(xù)執(zhí)行。順序流上也可帶條件一般結(jié)合gateway使用。圖標如下所示:

XML表示:

<sequenceFlow id="flow1" sourceRef="theStart" targetRef="theTask" />

排他網(wǎng)關(guān)(Exclusive Gateway)

也叫單一網(wǎng)關(guān),用來對流程中的決定進行建模。流程執(zhí)行到這種gateway時,按照輸出流定義的順序?qū)λ鼈冞M行計算。條件為 true 的順序流(或沒有設(shè)置條件,概念上順序流上定義為’true’)被選取繼續(xù)執(zhí)行流程。

注意:在多個順序流條件為true 的情況下,XML 中最先定義的那個被選取來繼續(xù)流程的執(zhí)行(僅有那個會被選中)。如果沒有選取到任何順序流,就會拋出異常。

如下圖所示:

?

XML表示:

<exclusiveGateway id="exclusiveGw" name="Exclusive Gateway" /> <sequenceFlow id="flow2" sourceRef="exclusiveGw" targetRef="theTask1"> <conditionExpression xsi:type="tFormalExpression">${input == 1}</conditionExpression> </sequenceFlow> <sequenceFlow id="flow3" sourceRef="exclusiveGw" targetRef="theTask2"> <conditionExpression xsi:type="tFormalExpression">${input == 2}</conditionExpression> </sequenceFlow> <sequenceFlow id="flow4" sourceRef="exclusiveGw" targetRef="theTask3"> <conditionExpression xsi:type="tFormalExpression">${input == 3}</conditionExpression> </sequenceFlow>

并行網(wǎng)關(guān)(Parallel Gateway)

Parallel gateway能拆分出多個執(zhí)行路徑,或多個輸入執(zhí)行路徑進行合并,通常先通過拆分的網(wǎng)關(guān)拆分成多個并行的順序流,然后再通過合并網(wǎng)關(guān)進行合并:

? ? 拆分(fork):并行執(zhí)行所有的輸出順序流,為每一個順序流創(chuàng)建一個并行執(zhí)行路徑。
? ? 合并(join):所有到達 parallel gataway 的并發(fā)性的執(zhí)行路徑都等待于此,直到每個輸入流都執(zhí)行到。然后,流
程經(jīng)由 joining gateway 繼續(xù)向下執(zhí)行。

如下圖所示:

上例中,XML表示:

<parallelGateway id="myParallelGateway" /> <startEvent id="theStart" /> <sequenceFlow id="flow1" sourceRef="theStart" targetRef="fork" /> <parallelGateway id="fork" /> <sequenceFlow sourceRef="fork" targetRef="receivePayment" /> <sequenceFlow sourceRef="fork" targetRef="shipOrder" /> <userTask id="receivePayment" name="Receive Payment" /> <sequenceFlow sourceRef="receivePayment" targetRef="join" /> <userTask id="shipOrder" name="Ship Order" /> <sequenceFlow sourceRef="shipOrder" targetRef="join" /> <parallelGateway id="join" /> <sequenceFlow sourceRef="join" targetRef="archiveOrder" /> <userTask id="archiveOrder" name="Archive Order" /> <sequenceFlow sourceRef="archiveOrder" targetRef="theEnd" /> <endEvent id="theEnd" />

用戶任務(wù)(User Task)

用戶任務(wù)用來對那些需要人參與完成的工作進行建模。當流程執(zhí)行到這樣的用戶任務(wù)時,會在分配任務(wù)的用戶或用戶組的任務(wù)列表中創(chuàng)建新的任務(wù)。

如下圖所示:

XML表示:

<userTask id="inspector_downpayment_approve_task" name="包賣付款審核" activiti:candidateGroups="inspector_downpayment_approve"><documentation>包賣付款審核</documentation> </userTask>

?

?

數(shù)據(jù)庫

ACT_RE_*: 'RE'表示repository。 這個前綴的表包含了流程定義和流程靜態(tài)資源 (圖片,規(guī)則,等等)。

ACT_RU_*: 'RU'表示runtime。 這些運行時的表,包含流程實例,任務(wù),變量,異步任務(wù),等運行中的數(shù)據(jù)。 Activiti只在流程實例執(zhí)行過程中保存這些數(shù)據(jù), 在流程結(jié)束時就會刪除這些記錄。 這樣運行時表可以一直很小速度很快。

ACT_ID_*: 'ID'表示identity。 這些表包含身份信息,比如用戶,組等等。

ACT_HI_*: 'HI'表示history。 這些表包含歷史數(shù)據(jù),比如歷史流程實例, 變量,任務(wù)等等。

ACT_GE_*: 通用數(shù)據(jù), 用于不同場景下,如存放資源文件。

表摘要如下:

表類型表名描述
ACT_EVTACT_EVT_LOG事件日志表
ACT_GE_*ACT_GE_BYTEARRAY二進制數(shù)據(jù)表,存儲流程定義相關(guān)的部署信息。即流程定義文檔的存放地。每部署一次就會增加兩條記錄,一條是關(guān)于bpmn規(guī)則文件的,一條是圖片的(如果部署時只指定了bpmn一個文件,activiti會在部署時解析bpmn文件內(nèi)容自動生成流程圖)。兩個文件都是以二進制形式存儲在數(shù)據(jù)庫中
ACT_GE_PROPERTY屬性數(shù)據(jù)表,存儲整個流程引擎級別的數(shù)據(jù),初始化表結(jié)構(gòu)時,會默認插入三條記錄。
ACT_HI_*ACT_HI_ACTINST歷史節(jié)點表,存放歷史所有完成的活動。
ACT_HI_ATTACHMENT歷史附件表
ACT_HI_COMMENT歷史意見表
ACT_HI_DETAIL歷史詳情表,提供歷史變量的查詢
ACT_HI_IDENTITYLINK歷史流程人員表,存儲任務(wù)的辦理人,包括個人任務(wù)和組任務(wù),表示歷史任務(wù)
ACT_HI_PROCINST歷史流程實例表,存儲已經(jīng)執(zhí)行完的歷史流程實例信息
ACT_HI_TASKINST歷史流程任務(wù)表,存儲已經(jīng)執(zhí)行完的歷史任務(wù)信息
ACT_HI_VARINST歷史變量表,存儲已經(jīng)執(zhí)行完的歷史流程變量信息
ACT_ID_*ACT_ID_GROUP用戶組信息表
ACT_ID_INFO用戶擴展信息表
ACT_ID_MEMBERSHIP用戶與用戶組關(guān)系信息表
ACT_ID_USER用戶信息表
ACT_RE_*ACT_RE_DEPLOYMENT部署信息表,存放流程定義的顯示名和部署時間
ACT_RE_MODEL流程設(shè)計模型部署表,存儲流程定義的數(shù)據(jù)信息。
ACT_RE_PROCDEF流程定義數(shù)據(jù)表,存放流程定義的屬性信息,部署每個新的流程定義都會在這張表中增加一條記錄。注意:當流程定義的key相同的情況下,使用的是版本升級
ACT_RU_*ACT_RU_EVENT_SUBSCRthrowEvent、catchEvent時間監(jiān)聽信息表
ACT_RU_EXECUTION運行時流程執(zhí)行對象表,當流程達到一個節(jié)點中時,會在執(zhí)行對象表中產(chǎn)生一條數(shù)據(jù),當流程結(jié)束后,流程實例將會在正在執(zhí)行的執(zhí)行對象表中被刪除
ACT_RU_IDENTITYLINK運行時流程人員表,主要存儲任務(wù)的辦理人,包括個人任務(wù)和組任務(wù),表示正在執(zhí)行的任務(wù)
ACT_RU_JOB運行時定時任務(wù)數(shù)據(jù)表
ACT_RU_TASK運行時任務(wù)節(jié)點表,當流程達到一個節(jié)點中時,會在執(zhí)行對象表中產(chǎn)生一條數(shù)據(jù),如果當前節(jié)點是用戶任務(wù)節(jié)點,這時也會在用戶任務(wù)節(jié)點表中增加一條記錄,當流程結(jié)束后,流程實例將會在正在執(zhí)行的任務(wù)節(jié)點表中被刪除
ACT_RU_VARIABLE運行時流程變量數(shù)據(jù)表,設(shè)置流程變量的時候,向act_ru_variable這個表添加數(shù)據(jù)

流程的定義、管理、執(zhí)行和部署

流程的定義和部署

? ? 流程的定義、部署、查詢、和刪除的代碼示例如下:

@Autowired private ProcessEngine processEngine; /**部署流程定義*/ @Test public void deploy(){String bpmnClassPath = "bpmn/test_process.bpmn20.xml";Deployment deployment = processEngine.getRepositoryService().createDeployment().addClasspathResource(bpmnClassPath).deploy();System.out.println(deployment.getId()+" "+deployment.getName()); } /**查看流程定義*/ @Test public void queryProcessDefinition() throwsException {//獲取倉庫服務(wù)對象,使用版本的升序排列,查詢列表List<ProcessDefinition> pdList = processEngine.getRepositoryService().createProcessDefinitionQuery()//添加查詢條件//.processDefinitionKey(processDefinitionKey)//排序.orderByProcessDefinitionVersion().asc().list();//查詢的結(jié)果集//遍歷集合,查看內(nèi)容for(ProcessDefinition pd : pdList) {System.out.println("id:" + pd.getId());System.out.println("name:" + pd.getName());System.out.println("key:" + pd.getKey());System.out.println("version:" + pd.getVersion());System.out.println("resourceName:"+pd.getDiagramResourceName());System.out.println("***************************************");} } @Test public void deleteDeployment() throws Exception {//刪除發(fā)布信息String deploymentId = "1";//獲取倉庫服務(wù)對象RepositoryService repositoryService = processEngine.getRepositoryService();//普通刪除,如果當前規(guī)則下有正在執(zhí)行的流程,則拋異常//repositoryService.deleteDeployment(deploymentId);//級聯(lián)刪除,會刪除和當前規(guī)則相關(guān)的所有信息,正在執(zhí)行的信息,也包括歷史信息//相當于:repositoryService.deleteDeploymentCascade(deploymentId);repositoryService.deleteDeployment(deploymentId,true); }

流程實例、任務(wù)的執(zhí)行

? ??啟動流程實例、查詢流程任務(wù)、辦理任務(wù)的代碼示例如下:

/*啟動流程實例*/ @Test public void startProcess() throws Exception {//通過流程定義的key啟動流程,會啟動版本最高的流程ProcessInstance pi = processEngines.getRuntimeService()//獲取正在執(zhí)行的Service.startProcessInstanceByKey("myProcess");//按照流程定義的key啟動流程實例,默認按照最新版本啟動System.out.println("pid:" + pi.getId() +",activitiId:" + pi.getActivitiId()+",pdId:"+pi.getProcessDefinitionId()); } /*查看個人任務(wù)*/ @Test public void startProcess() throws Exception {//配置查詢對象String assignee="張三";//創(chuàng)建任務(wù)查詢對象,查詢個人任務(wù)List<Task> list = processEngine.getTaskService().createTaskQuery().taskAssignee(assignee)//指定個人任務(wù)的辦理人查詢?nèi)蝿?wù).orderByTaskCreateTime().desc()//按照任務(wù)創(chuàng)建時間升序排列.list();//查詢?nèi)蝿?wù)的所有記錄System.out.println("======================【"+assignee+"】的個人任務(wù)列表=================");for(Task task: list) {System.out.print("id:"+task.getId()+",");System.out.print("name:"+task.getName()+",");System.out.print("createTime:"+task.getCreateTime()+",");System.out.println("assignee:"+task.getAssignee());} } /*辦理任務(wù)*/ @Test public void complete() throws Exception {String taskId = "1102";//完成任務(wù)processEngine.getTaskService().complete(taskId);//指定任務(wù)ID,完成任務(wù) }

流程變量

流程變量指流程實例中可能存在變化的量,比如請假流程中有請假天數(shù)、請假原因等一些參數(shù)都為流程變量的范圍。如下圖所示:

/**設(shè)置流程變量*/ @Test public void setVariables(){//獲取執(zhí)行的ServiceTaskService taskService = processEngine.getTaskService();//指定辦理人String assigneeUser = "張三";//流程實例IDString processInstanceId = "1701";Task task = taskService.createTaskQuery().taskAssignee(assigneeUser)//指定辦理人.processInstanceId(processInstanceId)//指定流程實例ID.singleResult();/**一:變量中存放基本數(shù)據(jù)類型*///taskService.setVariable(task.getId(), "請假人","李四");//使用流程變量的名稱和流程變量的值設(shè)置流程變量,一次只能設(shè)置一個值//taskService.setVariable(task.getId(), "請假天數(shù)",3);//taskService.setVariable(task.getId(), "請假日期",new Date());/**二:變量中存放javabean對象,前提:讓javabean對象實現(xiàn)implementsjava.io.Serializable*/Person p = new Person();p.setId(1L);p.setName("王五");taskService.setVariable(task.getId(), "人員信息",p);/**三:也可設(shè)置多個參數(shù)taskService.setVariables(taskId, variablesMap); }


用戶管理

主要包括創(chuàng)建用戶,創(chuàng)建組,以及建立組和用戶的關(guān)系。具體用的數(shù)據(jù)庫表包括:

act_id_group:角色組表

act_id_user:用戶表:

act_id_membership:用戶角色表

總結(jié)

以上是生活随笔為你收集整理的activiti工作流简介的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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