国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
最簡單的Activiti入門教程
這篇文章主要講以下三個(gè)方面
工作流介紹
工作流執(zhí)行過程
工作流模擬執(zhí)行
工作流介紹
以我們公司的報(bào)銷流程為例:
小明--->提交申請(qǐng)--->人事審批-->經(jīng)理審批-->財(cái)務(wù)審批--->結(jié)束
我們先思考一下,需要實(shí)現(xiàn)這的一個(gè)需求我們需要怎么做?
我們可能需要去維護(hù)一個(gè)變量,來不斷傳遞過去下一個(gè)處理者,或者是建相關(guān)的任務(wù)表之類的,如果需求不會(huì)變,沒有什么條件處理,這樣也好設(shè)計(jì)。
但是,如果有條件【不同職位員工審批方式不一樣】,需求更改了【不需要人事審批了】,那么我們的代碼就會(huì)亂,不好維護(hù)。
再來看這種問題就是一種流式的控制管理,基于這么一個(gè)原因,我們需要學(xué)習(xí)一個(gè)框架來幫我們完成并管理這樣的報(bào)銷流程,他可以在上級(jí)點(diǎn)擊同意后自動(dòng)將提交記錄錄到電腦并流轉(zhuǎn)到下一節(jié)點(diǎn),這就是我們這里要講的工作流技術(shù)。
工作流(Workflow),就是“業(yè)務(wù)過程的部分或整體在計(jì)算機(jī)應(yīng)用環(huán)境下的自動(dòng)化”,它主要解決的是“使在多個(gè)參與者之間按照某種預(yù)定義的規(guī)則傳遞文檔、信息或任務(wù)的過程自動(dòng)進(jìn)行,從而實(shí)現(xiàn)某個(gè)預(yù)期的業(yè)務(wù)目標(biāo),或者促使此目標(biāo)的實(shí)現(xiàn)”
這里我們也可以比對(duì)出工作流的優(yōu)點(diǎn):
提高系統(tǒng)的柔性,適應(yīng)業(yè)務(wù)流程的變化
實(shí)現(xiàn)更好的業(yè)務(wù)過程控制,提高顧客服務(wù)質(zhì)量
降低系統(tǒng)開發(fā)和維護(hù)成本
工作流執(zhí)行過程
我們以官網(wǎng)提供的示例包演示:
官網(wǎng)https://www.activiti.org/get-started下載對(duì)應(yīng)的jar包,解壓出來,在wars包目錄下有個(gè)activiti-app.war,把這個(gè)包放到tomgcat運(yùn)行(運(yùn)行之前我把數(shù)據(jù)庫配置改成我本地的mysql:WEB-INF\classes\META-INF\activiti-app\activiti-app.properties
項(xiàng)目啟動(dòng)成功進(jìn)入到首頁
1.png
Kickstart App:主要用于流程模型管理、表單管理及應(yīng)用(App)管理,一個(gè)應(yīng)用可以包含多個(gè)流程模型,應(yīng)用可發(fā)布給其他用戶使用。
Task App:用于管理整個(gè)activiti-app的任務(wù),在該功能里面也可以啟動(dòng)流程
Idenity management:身份信息管理,可以管理用戶、用戶組等數(shù)據(jù)
進(jìn)入第三個(gè)菜單Identity management
新建用戶:這邊新建用戶小明假設(shè)他為員工,王五是經(jīng)理
2.png
3.png
定義流程
在主界面點(diǎn)擊Kickstart App,點(diǎn)擊create Process按鈕彈出新建流程模型界面
4.png
5.png
6.png
上圖中定義了一個(gè)開始事件、兩個(gè)用戶任務(wù)、一個(gè)結(jié)束事件。我們定義的請(qǐng)假業(yè)務(wù),需要將該用戶任務(wù)分配給 小明。點(diǎn)擊第一個(gè)用戶任務(wù),并修改“Assignment”屬性,將“提交申請(qǐng)”任務(wù)分配給“xiaoming”用戶。保存成功后,再使用同樣的方法將“部門經(jīng)理審批”任務(wù)分配給 王五用戶,保存流程模型后,就可以將流程發(fā)布。
7.png
發(fā)布流程
在 activiti-app 中,一個(gè) App 可包含多個(gè)流程模型,因此在發(fā)布流程前,先新建一個(gè) App并為其設(shè)置流程模型。點(diǎn)擊 Apps 菜單,再點(diǎn)擊“Creaea App”按鈕,新建一個(gè) App,該App就包含我們前面所設(shè)計(jì)的請(qǐng)假流程模型
8.png
建好之后需要為其設(shè)置流程模型
9.png
點(diǎn)擊一下即可,在關(guān)閉
q.png
點(diǎn)擊進(jìn)入到app中,點(diǎn)擊發(fā)布public進(jìn)行發(fā)布
w.png
發(fā)布成功后使用小明賬戶登錄,進(jìn)入到首頁可以看到
e.png
進(jìn)入請(qǐng)假流程模型App并且點(diǎn)擊“Processes”菜單,在界面左上角,可以看到“Start a process”按鈕,點(diǎn)擊啟動(dòng)請(qǐng)假流程后,可以看到界面如圖所示
r.png
點(diǎn)擊complete,完成,任務(wù)跳轉(zhuǎn)到下一個(gè)執(zhí)行人
t.png
直至整個(gè)流程審批完成,結(jié)束
y.png
工作流模擬執(zhí)行
在我們模擬工作流流程之前在介紹下工作流引擎
ProcessEngine對(duì)象,這是Activiti工作的核心。負(fù)責(zé)生成流程運(yùn)行時(shí)的各種實(shí)例及數(shù)據(jù)、監(jiān)控和管理流程的運(yùn)行,其主要有以下兩個(gè)職責(zé)
定義流程,也就是給我們提供某種規(guī)范來定義規(guī)則,以及如何定義一個(gè)流程的這種規(guī)范,同事我們可以根據(jù)工作流引擎提供的相關(guān)概念來定義更為復(fù)雜的流程,這就是工作流引擎做的第一件事叫做定義流程。
執(zhí)行流程,也就是工作流引擎需要解釋這個(gè)規(guī)則,還要負(fù)責(zé)流程,它相當(dāng)于流程的調(diào)度者,監(jiān)控每個(gè)流程的執(zhí)行情況,并將流程操作發(fā)往下一步,或者根據(jù)條件休眠或終止流程的這么一個(gè)過程就叫做執(zhí)行流程。
了解完工作流引擎的這兩個(gè)職責(zé),我相信對(duì)于什么是工作流引擎一定已經(jīng)有了一定的認(rèn)識(shí)了,我們?cè)谟靡痪渖晕⒂悬c(diǎn)官方的話來總結(jié)一下工作流引擎:工作流引擎為我們提供相關(guān)規(guī)則概念的定義,給我們提供了相關(guān)的API來調(diào)用這個(gè)引擎去執(zhí)行流程。流程的操作實(shí)際上就是工作流引擎提供相關(guān)的api我們?nèi)フ{(diào)用它。
activiti.cfg.xml(activiti的配置文件)
Activiti核心配置文件,配置流程引擎創(chuàng)建工具的基本參數(shù)和數(shù)據(jù)庫連接池參數(shù)
定義數(shù)據(jù)庫配置參數(shù)
jdbcUrl: 數(shù)據(jù)庫的JDBC URL。
jdbcDriver: 對(duì)應(yīng)不同數(shù)據(jù)庫類型的驅(qū)動(dòng)。
jdbcUsername: 連接數(shù)據(jù)庫的用戶名。
jdbcPassword: 連接數(shù)據(jù)庫的密碼。
基于JDBC參數(shù)配置的數(shù)據(jù)庫連接 會(huì)使用默認(rèn)的MyBatis連接池。 下面的參數(shù)可以用來配置連接池(來自MyBatis參數(shù))
jdbcMaxActiveConnections: 連接池中處于被使用狀態(tài)的連接的最大值。默認(rèn)為10。
jdbcMaxIdleConnections: 連接池中處于空閑狀態(tài)的連接的最大值。
jdbcMaxCheckoutTime: 連接被取出使用的最長時(shí)間,超過時(shí)間會(huì)被強(qiáng)制回收。 默認(rèn)為20000(20秒)。
jdbcMaxWaitTime: 這是一個(gè)底層配置,讓連接池可以在長時(shí)間無法獲得連接時(shí), 打印一條日志,并重新嘗試獲取一個(gè)連接。(避免因?yàn)殄e(cuò)誤配置導(dǎo)致沉默的操作失?。?。 默認(rèn)為20000(20秒)
下面所有的操作都需要用到工作流引擎對(duì)象,我們可以如下方式獲取:
ProcessEngine processEngine= ProcessEngines.getDefaultProcessEngine();
這里默認(rèn)會(huì)去資源路徑下讀取配置文件activiti.cfg.xml
我們?cè)賮砘仡櫹鹿ぷ髁鲌?zhí)行過程,首先需要畫好流程圖,然后部署到app上
這個(gè)步驟我們叫:部署流程定義
public void deploymentProcessDefinition(){ Deployment deploy = processEngine.getRepositoryService() //與流程定義和部署對(duì)象相關(guān)的Service .createDeployment() //創(chuàng)建一個(gè)部署對(duì)象 .name("審批流程") //添加部署名稱 .addClasspathResource("diagrams/audit.xml") //從classPath資源中加載,一次只能加載一個(gè)文件 .addClasspathResource("diagrams/audit.png") .deploy(); //完成部署 }
說明:
首先獲得默認(rèn)的流程引擎,通過流程引擎獲取了一個(gè)RepositoryService對(duì)象(倉庫對(duì)象)
由倉庫的服務(wù)對(duì)象產(chǎn)生一個(gè)部署對(duì)象配置對(duì)象,用來封裝部署操作的相關(guān)配置。
這是一個(gè)鏈?zhǔn)骄幊?,在部署配置?duì)象中設(shè)置顯示名,上傳流程定義規(guī)則文件
向數(shù)據(jù)庫表中存放流程定義的規(guī)則信息。
這一步在數(shù)據(jù)庫中將操作三張表
act_re_deployment(部署對(duì)象表)
存放流程定義的顯示名和部署時(shí)間,每部署一次增加一條記錄
act_re_procdef(流程定義表)
存放流程定義的屬性信息,部署每個(gè)新的流程定義都會(huì)在這張表中增加一條記錄。
注意:當(dāng)流程定義的key相同的情況下,使用的是版本升級(jí)
act_ge_bytearray(資源文件表)
存儲(chǔ)流程定義相關(guān)的部署信息。即流程定義文檔的存放地。每部署一次就會(huì)增加兩條記錄,一條是關(guān)于bpmn規(guī)則文件的,一條是圖片的(如果部署時(shí)只指定了bpmn一個(gè)文件,activiti會(huì)在部署時(shí)解析bpmn文件內(nèi)容自動(dòng)生成流程圖)。兩個(gè)文件不是很大,都是以二進(jìn)制形式存儲(chǔ)在數(shù)據(jù)庫中
然后需要發(fā)布:啟動(dòng)流程
public void startProcess(){ ProcessInstance process = processEngine.getRuntimeService().startProcessInstanceByKey("myProcess_1"); }
操作數(shù)據(jù)庫的act_ru_execution表,如果是用戶任務(wù)節(jié)點(diǎn),同時(shí)也會(huì)在act_ru_task添加一條記錄,我們可以看到小明會(huì)有一條任務(wù),查詢操作如下:
List<Task> taskList = processEngine.getTaskService()//與正在執(zhí)行的任務(wù)管理相關(guān)的Service .createTaskQuery()//創(chuàng)建任務(wù)查詢對(duì)象 /**查詢條件(where部分)*/ .taskAssignee("小明")//指定個(gè)人任務(wù)查詢,指定辦理人// .taskCandidateUser(candidateUser)//組任務(wù)的辦理人查詢// .processDefinitionId(processDefinitionId)//使用流程定義ID查詢// .processInstanceId(processInstanceId)//使用流程實(shí)例ID查詢// .executionId(executionId)//使用執(zhí)行對(duì)象ID查詢 /**排序*/ .orderByTaskCreateTime().asc()//使用創(chuàng)建時(shí)間的升序排列 /**返回結(jié)果集*/// .singleResult()//返回惟一結(jié)果集// .count()//返回結(jié)果集的數(shù)量// .listPage(firstResult, maxResults);//分頁查詢 .list();//返回列表 for (Task task:taskList){ System.out.println("任務(wù)ID:"+task.getId()); System.out.println("任務(wù)名稱:"+task.getName()); System.out.println("任務(wù)的創(chuàng)建時(shí)間:"+task.getCreateTime()); System.out.println("任務(wù)的辦理人:"+task.getAssignee()); System.out.println("流程實(shí)例ID:"+task.getProcessInstanceId()); System.out.println("執(zhí)行對(duì)象ID:"+task.getExecutionId()); System.out.println("流程定義ID:"+task.getProcessDefinitionId()); }
說明
因?yàn)槭侨蝿?wù)查詢,所以從processEngine中應(yīng)該得到TaskService
使用TaskService獲取到任務(wù)查詢對(duì)象TaskQuery
為查詢對(duì)象添加查詢過濾條件,使用taskAssignee指定任務(wù)的辦理者(即查詢指定用戶的代辦任務(wù)),同時(shí)可以添加分頁排序等過濾條件
調(diào)用list方法執(zhí)行查詢,返回辦理者為指定用戶的任務(wù)列表
任務(wù)ID、名稱、辦理人、創(chuàng)建時(shí)間可以從act_ru_task表中查到。
一個(gè)Task節(jié)點(diǎn)和Execution節(jié)點(diǎn)是1對(duì)1的情況,在task對(duì)象中使用Execution_來表示他們之間的關(guān)系
任務(wù)ID在數(shù)據(jù)庫表act_ru_task中對(duì)應(yīng)“ID_”列
完成任務(wù)
public void completeMyPersonalTask(){ processEngine.getTaskService(). //正在執(zhí)行任務(wù)相關(guān)的Service complete("104"); //根據(jù)taskid完成任務(wù) }
說明
是辦理任務(wù),所以從ProcessEngine得到的是TaskService。
當(dāng)執(zhí)行完這段代碼,再以員工的身份去執(zhí)行查詢的時(shí)候,會(huì)發(fā)現(xiàn)這個(gè)時(shí)候已經(jīng)沒有數(shù)據(jù)了,因?yàn)檎趫?zhí)行的任務(wù)中沒有數(shù)據(jù)。
對(duì)于執(zhí)行完的任務(wù),activiti將從act_ru_task表中刪除該任務(wù),下一個(gè)任務(wù)會(huì)被插入進(jìn)來。
以”部門經(jīng)理”的身份進(jìn)行查詢,可以查到結(jié)果。因?yàn)榱鞒虉?zhí)行到部門經(jīng)理審批這個(gè)節(jié)點(diǎn)了。
再執(zhí)行辦理任務(wù)代碼,執(zhí)行完以后以”部門經(jīng)理”身份進(jìn)行查詢,沒有結(jié)果。
重復(fù)第4和5步直到流程執(zhí)行完。
綜上,我們可以總結(jié)出這個(gè)幾個(gè)Service
RepositoryService
是Activiti的倉庫服務(wù)類。所謂的倉庫指流程定義文檔的兩個(gè)文件:bpmn文件和流程圖片。
RuntimeService
是activiti的流程執(zhí)行服務(wù)類??梢詮倪@個(gè)服務(wù)類中獲取很多關(guān)于流程執(zhí)行相關(guān)的信息。
TaskService
是activiti的任務(wù)服務(wù)類??梢詮倪@個(gè)類中獲取任務(wù)的信息。
HistoryService
是activiti的查詢歷史信息的類。在一個(gè)流程執(zhí)行完成后,這個(gè)對(duì)象為我們提供查詢歷史信息。
亦可以總結(jié)所用到的表
ACT_RE_*: 'RE'表示repository。 這個(gè)前綴的表包含了流程定義和流程靜態(tài)資源 (圖片,規(guī)則,等等)。
ACT_RU_*: 'RU'表示runtime。 這些運(yùn)行時(shí)的表,包含流程實(shí)例,任務(wù),變量,異步任務(wù),等運(yùn)行中的數(shù)據(jù)。 Activiti只在流程實(shí)例執(zhí)行過程中保存這些數(shù)據(jù), 在流程結(jié)束時(shí)就會(huì)刪除這些記錄。 這樣運(yùn)行時(shí)表可以一直很小速度很快。
ACT_ID_*: 'ID'表示identity。 這些表包含身份信息,比如用戶,組等等。
ACT_HI_*: 'HI'表示history。 這些表包含歷史數(shù)據(jù),比如歷史流程實(shí)例, 變量,任務(wù)等等。
ACT_GE_*: 通用數(shù)據(jù), 用于不同場景下,如存放資源文件。
資源庫流程規(guī)則表
act_re_deployment 部署信息表
act_re_model 流程設(shè)計(jì)模型部署表
act_re_procdef 流程定義數(shù)據(jù)表
運(yùn)行時(shí)數(shù)據(jù)庫表
act_ru_execution 運(yùn)行時(shí)流程執(zhí)行實(shí)例表
act_ru_identitylink 運(yùn)行時(shí)流程人員表,主要存儲(chǔ)任務(wù)節(jié)點(diǎn)與參與者的相關(guān)信息
act_ru_task 運(yùn)行時(shí)任務(wù)節(jié)點(diǎn)表
act_ru_variable 運(yùn)行時(shí)流程變量數(shù)據(jù)表
act_ru_job 工作數(shù)據(jù)表
act_ru_event_subscr 事件描述表
歷史數(shù)據(jù)庫表
act_hi_actinst 歷史節(jié)點(diǎn)表
act_hi_attachment 歷史附件表
act_hi_comment 歷史意見表
act_hi_identitylink 歷史流程人員表
act_hi_detail 歷史詳情表,提供歷史變量的查詢
act_hi_procinst 歷史流程實(shí)例表
act_hi_taskinst 歷史任務(wù)實(shí)例表
act_hi_varinst 歷史變量表
組織機(jī)構(gòu)表
act_id_group 用戶組信息表
act_id_info 用戶擴(kuò)展信息表
act_id_membership 用戶與用戶組對(duì)應(yīng)信息表
act_id_user 用戶信息表
通用數(shù)據(jù)表
act_ge_bytearray 二進(jìn)制數(shù)據(jù)表
act_ge_property 屬性數(shù)據(jù)表存儲(chǔ)整個(gè)流程引擎級(jí)別的數(shù)據(jù),初始化表結(jié)構(gòu)時(shí),會(huì)默認(rèn)插入三條記錄,
27102725_uKzQ.jpg
企業(yè)中的應(yīng)用
未完
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
flowable 表結(jié)構(gòu)說明
activiti_5.2 數(shù)據(jù)庫表結(jié)構(gòu)
activiti工作流數(shù)據(jù)庫表詳細(xì)介紹(23張表)
Activiti最全入門教程
activiti入門二(持久化)
activiti5.13 框架 數(shù)據(jù)庫設(shè)計(jì)說明書
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服