黑馬程序員-activiti工作流視頻企業(yè)開(kāi)發(fā)實(shí)例講解activiti5.4課程新_第1頁(yè)
黑馬程序員-activiti工作流視頻企業(yè)開(kāi)發(fā)實(shí)例講解activiti5.4課程新_第2頁(yè)
黑馬程序員-activiti工作流視頻企業(yè)開(kāi)發(fā)實(shí)例講解activiti5.4課程新_第3頁(yè)
黑馬程序員-activiti工作流視頻企業(yè)開(kāi)發(fā)實(shí)例講解activiti5.4課程新_第4頁(yè)
黑馬程序員-activiti工作流視頻企業(yè)開(kāi)發(fā)實(shí)例講解activiti5.4課程新_第5頁(yè)
已閱讀5頁(yè),還剩104頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、北京傳智播客教育 Activiti5.4工作流講師: 劉洋北京傳智播客教育 Activiti入門北京傳智播客教育 Activiti入門工作流(Workflow),就是“業(yè)務(wù)過(guò)程的部分或整體在計(jì)算機(jī)應(yīng)用環(huán)境下的自動(dòng)化”,它主要解決的是“使在多個(gè)參與者之間按照某種預(yù)定義的規(guī)則傳遞文檔、信息或任務(wù)的過(guò)程自動(dòng)進(jìn)行,從而實(shí)現(xiàn)某個(gè)預(yù)期的業(yè)務(wù)目標(biāo),或者促使此目標(biāo)的實(shí)現(xiàn)”。通俗的說(shuō),流程就是多個(gè)人在一起合作完成某件事情的步驟,把步驟變成計(jì)算機(jī)能理解的形式就是工作流。北京傳智播客教育 Activiti入門工作流管理系統(tǒng)(Workflow Management System, WfMS)是一個(gè)軟件系統(tǒng),它完成工作

2、量的定義和管理,并按照在系統(tǒng)中預(yù)先定義好的工作流規(guī)則進(jìn)行工作流實(shí)例的執(zhí)行。工作流管理系統(tǒng)不是企業(yè)的業(yè)務(wù)系統(tǒng),而是為企業(yè)的業(yè)務(wù)系統(tǒng)的運(yùn)行提供了一個(gè)軟件的支撐環(huán)境。工作流管理聯(lián)盟(WfMC,Workflow Management Coalition)給出的關(guān)于工作流管理系統(tǒng)的定義是:工作流管理系統(tǒng)是一個(gè)軟件系統(tǒng),它通過(guò)執(zhí)行經(jīng)過(guò)計(jì)算的流程定義去支持一批專門設(shè)定的業(yè)務(wù)流程。工作流管理系統(tǒng)被用來(lái)定義、管理、和執(zhí)行工作流程。1、定義工作流:包括具體的活動(dòng)、規(guī)則等。2、執(zhí)行工作流:按照流程定義的規(guī)則執(zhí)行,并由多個(gè)參與者進(jìn)行控制。工作流主要實(shí)現(xiàn)功能一、定義工作流二、執(zhí)行工作流 eclipse或者myeclip

3、se安裝activiti插件順序、分支、聚合、并發(fā)北京傳智播客教育 Activiti入門采用工作流管理系統(tǒng)的優(yōu)點(diǎn)1、提高系統(tǒng)的柔性,適應(yīng)業(yè)務(wù)流程的變化2、實(shí)現(xiàn)更好的業(yè)務(wù)過(guò)程控制,提高顧客服務(wù)質(zhì)量3、降低系統(tǒng)開(kāi)發(fā)和維護(hù)成本工作流框架有:Activiti、JBPM、OSWorkflow、ActiveBPEL、YAWL等。工作流系統(tǒng)的優(yōu)點(diǎn):北京傳智播客教育 Activiti入門Activiti5是由Alfresco軟件在2010年5月17日發(fā)布的業(yè)務(wù)流程管理(BPM)框架,它是覆蓋了業(yè)務(wù)流程管理、工作流、服務(wù)協(xié)作等領(lǐng)域的一個(gè)開(kāi)源的、靈活的、易擴(kuò)展的可執(zhí)行流程語(yǔ)言框架。Activiti基于Apache

4、許可的開(kāi)源BPM平臺(tái),創(chuàng)始人Tom Baeyens是JBoss Activiti的項(xiàng)目架構(gòu)師,它特色是提供了eclipse插件,開(kāi)發(fā)人員可以通過(guò)插件直接繪畫(huà)出業(yè)務(wù)流程圖。 開(kāi)源工作流Activiti5.4介紹:北京傳智播客教育 Activiti入門Activiti數(shù)據(jù)庫(kù)支持:Activiti的后臺(tái)是有數(shù)據(jù)庫(kù)的支持,所有的表都以ACT_開(kāi)頭。 第二部分是表示表的用途的兩個(gè)字母標(biāo)識(shí)。 用途也和服務(wù)的API對(duì)應(yīng)。ACT_RE_*: RE表示repository。 這個(gè)前綴的表包含了流程定義和流程靜態(tài)資源 (圖片,規(guī)則,等等)。ACT_RU_*: RU表示runtime。 這些運(yùn)行時(shí)的表,包含流程實(shí)例

5、,任務(wù),變量,異步任務(wù),等運(yùn)行中的數(shù)據(jù)。 Activiti只在流程實(shí)例執(zhí)行過(guò)程中保存這些數(shù)據(jù), 在流程結(jié)束時(shí)就會(huì)刪除這些記錄。 這樣運(yùn)行時(shí)表可以一直很小速度很快。ACT_ID_*: ID表示identity。 這些表包含身份信息,比如用戶,組等等。ACT_HI_*: HI表示history。 這些表包含歷史數(shù)據(jù),比如歷史流程實(shí)例, 變量,任務(wù)等等。ACT_GE_*: 通用數(shù)據(jù), 用于不同場(chǎng)景下,如存放資源文件。北京傳智播客教育 準(zhǔn)備Activiti環(huán)境北京傳智播客教育 準(zhǔn)備Activiti環(huán)境activiti5 軟件環(huán)境JDK1.6或者更高版本支持的數(shù)據(jù)庫(kù)有:h2, mysql, oracle

6、, postgres, mssql, db2等。支持activiti5運(yùn)行的jar包開(kāi)發(fā)環(huán)境為Eclipse3.7或者以上版本,myeclipse為8.6版本或以上版本相關(guān)資源下載JDK可以到sun的官網(wǎng)下載 數(shù)據(jù)庫(kù),例如:mysql可以在官網(wǎng)上下載。 activiti也可以到Activiti官方網(wǎng)站下載得到。 Eclipse3.7或者M(jìn)yEclipse8.6也可以到相應(yīng)的網(wǎng)站上獲得下載。北京傳智播客教育 準(zhǔn)備Activiti環(huán)境安裝流程設(shè)計(jì)器(Eclipse插件 )在沒(méi)有網(wǎng)絡(luò)的情況下,安裝流程設(shè)計(jì)器步驟如下:解壓老師發(fā)給大家的把壓縮包中的內(nèi)容放入eclipse根目錄的dropins文件夾下北

7、京傳智播客教育 準(zhǔn)備Activiti環(huán)境重啟eclipse,點(diǎn)擊新建工程new-Other打開(kāi)面板,如果看到下圖內(nèi)容:北京傳智播客教育 準(zhǔn)備Activiti環(huán)境準(zhǔn)備JPBM的開(kāi)發(fā)環(huán)境1、$Activiti_HOME/install/activiti-5.13/libs(核心包)2、添加數(shù)據(jù)庫(kù)對(duì)應(yīng)的驅(qū)動(dòng)的jar包mysql-connector-java.jarJar包可以從:activiti-5.13warsactiviti-restWEB-INFlib中獲取,可以去掉junit的jar包北京傳智播客教育 準(zhǔn)備Activiti環(huán)境初始化數(shù)據(jù)庫(kù)方法一:執(zhí)行sql腳本文件activiti-5.13d

8、atabasecreateactiviti.mysql.create.*.sql文件北京傳智播客教育 準(zhǔn)備Activiti環(huán)境初始化數(shù)據(jù)庫(kù)方法二:使用代碼:Testpublic void createTable() /1.創(chuàng)建Activiti配置對(duì)象的實(shí)例ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();/2.設(shè)置數(shù)據(jù)庫(kù)連接信息/ 設(shè)置數(shù)據(jù)庫(kù)地址configuration.setJdbcUrl(jdbc:mysql:

9、/localhost:3306/testactiviti?createDatabaseIfNotExist&useUnicode=true&characterEncoding=utf8);/ 數(shù)據(jù)庫(kù)驅(qū)動(dòng)configuration.setJdbcDriver(com.mysql.jdbc.Driver);/ 用戶名configuration.setJdbcUsername(root);/ 密碼configuration.setJdbcPassword(root);/ 設(shè)置數(shù)據(jù)庫(kù)建表策略/* * DB_SCHEMA_UPDATE_TRUE:如果不存在表就創(chuàng)建表,存在就直接使用 * DB_SCHEM

10、A_UPDATE_FALSE:如果不存在表就拋出異常 * DB_SCHEMA_UPDATE_CREATE_DROP:每次都先刪除表,再創(chuàng)建新的表 */configuration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);/3.使用配置對(duì)象創(chuàng)建流程引擎實(shí)例(檢查數(shù)據(jù)庫(kù)連接等環(huán)境信息是否正確)ProcessEngine processEngine = configuration.buildProcessEngine();System.out.println(processEngine);北京傳

11、智播客教育 準(zhǔn)備Activiti環(huán)境初始化數(shù)據(jù)庫(kù)方法三:使用配置文件:在類路徑下創(chuàng)建Activiti.cfg.xml。北京傳智播客教育 準(zhǔn)備Activiti環(huán)境初始化數(shù)據(jù)庫(kù)方法三:使用配置文件:在類路徑下創(chuàng)建Activiti.cfg.xml。 北京傳智播客教育 準(zhǔn)備Activiti環(huán)境初始化數(shù)據(jù)庫(kù)方法三:使用配置文件:在類路徑下創(chuàng)建Activiti.cfg.xml。/測(cè)試流程引擎Testpublic void testDBByProperties() throws Exception / 1。 加載classpath下名為activiti.cfg.xml文件,創(chuàng)建核心流程引擎對(duì)象Process

12、Engine processEngine = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(activiti.cfg.xml).buildProcessEngine();System.out.println(processEngine);北京傳智播客教育 第一章:Activiti程序HelloWorld北京傳智播客教育 JPBM程序HelloWorld流程圖北京傳智播客教育 Activiti程序HelloWorld建表并創(chuàng)建流程引擎對(duì)象(核心對(duì)象)Testpublic void testProce

13、ssEngine() / 獲取流程引擎 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); System.out.println(processEngine);流程引擎(Activiti工作流核心對(duì)象)在前面看到了兩種創(chuàng)建ProcessEngine(流程引擎)的方式,而這里要簡(jiǎn)化很多,調(diào)用ProcessEngines的getDefaultProceeEngine方法時(shí)會(huì)自動(dòng)加載classpath下名為activiti.cfg.xml文件。北京傳智播客教育 Activiti程序HelloWorld部署流程

14、定義Testpublic void deploy() throws Exception / 獲取流程引擎ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();/ 獲取倉(cāng)庫(kù)服務(wù)的實(shí)例Deployment deployment = processEngine.getRepositoryService()/.createDeployment()/.addClasspathResource(diagrams/Leave.bpmn)/.addClasspathResource(diagrams/Leave.png)/

15、.deploy();System.out.println(deployment.getId()+ +deployment.getName();北京傳智播客教育 Activiti程序HelloWorld啟動(dòng)流程實(shí)例/2. 啟動(dòng)流程Testpublic void startProcess() throws Exception / 獲取流程引擎對(duì)象ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();/ 啟動(dòng)流程/使用流程定義的key啟動(dòng)流程實(shí)例,默認(rèn)會(huì)按照最新版本啟動(dòng)流程實(shí)例ProcessInstance pi

16、 = processEngine.getRuntimeService().startProcessInstanceByKey(myProcess);System.out.println(pid: + pi.getId() +,activitiId: + pi.getActivitiId();北京傳智播客教育 Activiti程序HelloWorld查詢我的任務(wù)列表(正在執(zhí)行的任務(wù))/3. 查看任務(wù)Testpublic void queryMyTask() throws Exception / 指定任務(wù)辦理者String assignee = 張三;/ 獲取流程引擎對(duì)象ProcessEngine

17、 processEngine = ProcessEngines.getDefaultProcessEngine();/ 查詢?nèi)蝿?wù)的列表List tasks = processEngine.getTaskService().createTaskQuery()/創(chuàng)建任務(wù)查詢對(duì)象.taskAssignee(assignee)/指定個(gè)人任務(wù)辦理人.list();/ 遍歷結(jié)合查看內(nèi)容for (Task task : tasks) System.out.println(taskId: + task.getId()+,taskName: + task.getName();System.out.println

18、(*);北京傳智播客教育 Activiti程序HelloWorld辦理任務(wù)/4. 辦理任務(wù)Testpublic void completeTask() throws Exception String taskId = 104;/ 獲取流程引擎對(duì)象ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();/ 完成任務(wù)processEngine.getTaskService() plete(taskId);System.out.println(完成任務(wù)!);北京傳智播客教育 第二章:流程定義管理CRUD北京傳智播客

19、教育 流程定義管理CRUD流程圖北京傳智播客教育 流程定義管理CRUD部署流程定義/ 部署(classpath)Testpublic void deploy() throws Exception / 獲取倉(cāng)庫(kù)服務(wù),完成部署 Deployment deployment = processEngine.getRepositoryService().createDeployment().name(請(qǐng)假流程)/ 添加部署規(guī)則的顯示別名.addClasspathResource(diagrams/Leave.bpmn)/ 添加定義的規(guī)則文件.addClasspathResource(diagrams/L

20、eave.png)/ 添加定義的規(guī)則圖片.deploy();/完成發(fā)布 System.out.println(deployment.getId()+ +deployment.getName();/ 部署(zip)Testpublic void testDeploy_zip() throws Exception / 獲得上傳文件的輸入流程InputStream in = this.getClass().getClassLoader().getResourceAsStream(diagrams/leave.zip);ZipInputStream zipInputStream = new ZipIn

21、putStream(in);/ 獲取倉(cāng)庫(kù)服務(wù),從類路徑下完成部署Deployment deployment = processEngine.getRepositoryService().createDeployment().name(請(qǐng)假流程)/ 添加部署規(guī)則的顯示別名.addZipInputStream(zipInputStream)/使用zip的輸入流完成部署.deploy();/完成發(fā)布System.out.println(deployment.getId()+ +deployment.getName();北京傳智播客教育 流程定義管理CRUD查詢流程定義/ 查詢所有Testpublic

22、 void queryProcessDefinition() throws Exception / 獲取倉(cāng)庫(kù)服務(wù)對(duì)象,使用版本的升序排列,查詢列表List pdList = processEngine.getRepositoryService().createProcessDefinitionQuery()/添加查詢條件/.processDefinitionName(processDefinitionName)/.processDefinitionId(processDefinitionId)/.processDefinitionKey(processDefinitionKey)/排序.ord

23、erByProcessDefinitionVersion().asc()/查詢的結(jié)果集/.count()/返回結(jié)果集的數(shù)量/.listPage(firstResult, maxResults)/分頁(yè)查詢/.singleResult()/惟一結(jié)果集.list();/總的結(jié)果集數(shù)量/ 遍歷集合,查看內(nèi)容for (ProcessDefinition pd : pdList) System.out.println(id: + pd.getId();System.out.println(name: + pd.getName();System.out.println(key: + pd.getKey();

24、System.out.println(version: + pd.getVersion();System.out.println(resourceName:+pd.getDiagramResourceName();System.out.println(*);北京傳智播客教育 流程定義管理CRUD刪除流程定義(使用部署流程定義ID)/ 刪除(使用流程定義ID)Testpublic void deleteDeployment() throws Exception / 刪除發(fā)布信息String deploymentId = 1;/ 獲取倉(cāng)庫(kù)服務(wù)對(duì)象RepositoryService reposito

25、ryService = processEngine.getRepositoryService();/ 普通刪除,如果當(dāng)前規(guī)則下有正在執(zhí)行的流程,則拋異常/repositoryService.deleteDeployment(deploymentId);/ 級(jí)聯(lián)刪除,會(huì)刪除和當(dāng)前規(guī)則相關(guān)的所有信息,正在執(zhí)行的信息,也包括歷史信息/ 相當(dāng)于:repositoryService.deleteDeploymentCascade(deploymentId);repositoryService.deleteDeployment(deploymentId, true);北京傳智播客教育 流程定義管理CRUD

26、查看流程定義的流程圖/ 查看流程圖(xxx.png)Testpublic void showView() throws Exception / 從倉(cāng)庫(kù)中找需要展示的文件String deploymentId = 501;List names = processEngine.getRepositoryService().getDeploymentResourceNames(deploymentId);String imageName = ;for (String name : names) System.out.println(name:+name);If(name.indexOf(.png)=

27、0)imageName = name;System.out.println(imageName:+imageName);if(imageName!=null)/System.out.println(imageName);File f = new File(e:/+ imageName);/ 通過(guò)部署ID和文件名稱得到文件的輸入流InputStream in = processEngine.getRepositoryService() .getResourceAsStream(deploymentId, imageName);FileUtils.copyInputStreamToFile(in,

28、 f);北京傳智播客教育 流程定義管理CRUD查詢所有最新版本的流程定義Testpublic void queryAllLatestVersions() throws Exception / 查詢,把最大的版本都排到后面List list = processEngine.getRepositoryService()/.createProcessDefinitionQuery()/.orderByProcessDefinitionVersion().asc()/.list();/ 過(guò)濾出最新的版本Map map = new LinkedHashMap();for (ProcessDefiniti

29、on pd : list) map.put(pd.getKey(), pd);/ 顯示for (ProcessDefinition pd : map.values() System.out.println(id: + pd.getId()/ 格式:key-version + , name: + pd.getName()/ .jpdl.xml根元素的name屬性的值 + , key: + pd.getKey()/ .jpdl.xml根元素的key屬性的值,如果不寫(xiě),默認(rèn)為name屬性的值 + , version: + pd.getVersion()/ 默認(rèn)自動(dòng)維護(hù),第1個(gè)是1,以后相同key的都

30、會(huì)自動(dòng)加1 + , deploymentId: + pd.getDeploymentId(); / 所屬的某個(gè)Deployment的對(duì)象北京傳智播客教育 流程定義管理CRUD刪除流程定義(刪除key相同的所有不同版本的流程定義)Testpublic void deleteByKey() throws Exception / 1,查詢指定key的所有版本的流程定義List list = processEngine.getRepositoryService()/.createProcessDefinitionQuery()/.processDefinitionKey(myProcess)/指定流程

31、定義的key查詢.list();/ 2,循環(huán)刪除for (ProcessDefinition pd : list) processEngine.getRepositoryService()/.deleteDeployment(pd.getDeploymentId(), true);System.out.println(刪除成功!);北京傳智播客教育 流程定義管理CRUD流程定義中涉及到的Activiti表Deployment 部署對(duì)象1、一次部署的多個(gè)文件的信息。對(duì)于不需要的流程可以刪除和修改。2、對(duì)應(yīng)的表: act_re_deployment:部署對(duì)象表 act_re_procdef:流程定

32、義表 act_ge_bytearray:資源文件表 act_ge_property:主鍵生成策略表ProcessDefinition 流程定義1、解析.jpdl.xml后得到的流程定義規(guī)則的信息,工作流系統(tǒng)就是按照流程定義的規(guī)則執(zhí)行的。北京傳智播客教育 第三章:流程實(shí)例、任務(wù)的執(zhí)行北京傳智播客教育 流程實(shí)例的執(zhí)行流程圖北京傳智播客教育 流程實(shí)例的執(zhí)行部署流程定義:Testpublic void deployZIP() throws Exception / 獲得上傳文件的輸入流程InputStream in = this.getClass().getClassLoader().getResour

33、ceAsStream(diagrams/leave.zip);ZipInputStream zipInputStream = new ZipInputStream(in);/ 獲取倉(cāng)庫(kù)服務(wù),從類路徑下完成部署Deployment deployment = processEngine.getRepositoryService()/.createDeployment()/.name(請(qǐng)假流程)/ 添加部署規(guī)則的顯示別名.addZipInputStream(zipInputStream)/使用zip的輸入流完成部署.deploy();/完成發(fā)布System.out.println(deploymen

34、t.getId()+ +deployment.getName();北京傳智播客教育 流程實(shí)例的執(zhí)行啟動(dòng)流程實(shí)例:/ 啟動(dòng)流程實(shí)例Testpublic void startProcess() throws Exception / 按照流程定義的id啟動(dòng): myProcess:2:604/ runtimeService.startProcessInstanceById(processDefinitionId)/ 通過(guò)流程定義的key啟動(dòng)流程,會(huì)啟動(dòng)版本最高的流程ProcessInstance pi = ProcessEngines.getDefaultProcessEngine()/ .getRu

35、ntimeService()/獲取正在執(zhí)行的Service .startProcessInstanceByKey(myProcess);/按照流程定義的key啟動(dòng)流程實(shí)例,默認(rèn)按照最新版本啟動(dòng)System.out.println(pid: + pi.getId() +,activitiId: + pi.getActivitiId()+,pdId:+pi.getProcessDefinitionId();北京傳智播客教育 流程實(shí)例的執(zhí)行查看我的任務(wù)列表:/ 查看個(gè)人任務(wù)Testpublic void queryPersonalTask() throws Exception / 配置查詢對(duì)象Str

36、ing assignee=張三;/ 創(chuàng)建任務(wù)查詢對(duì)象,查詢個(gè)人任務(wù)List list = processEngine.getTaskService()/.createTaskQuery()/.taskAssignee(assignee)/指定個(gè)人任務(wù)的辦理人查詢?nèi)蝿?wù).orderByTaskCreateTime().desc()/按照任務(wù)創(chuàng)建時(shí)間升序排列.list();/查詢?nèi)蝿?wù)的所有記錄System.out.println(=【+assignee+】的個(gè)人任務(wù)列表=);for (Task task : list) System.out.print(id:+task.getId()+,);Sys

37、tem.out.print(name:+task.getName()+,);System.out.print(createTime:+task.getCreateTime()+,);System.out.println(assignee:+task.getAssignee();北京傳智播客教育 流程實(shí)例的執(zhí)行辦理任務(wù):/ 辦理任務(wù)Testpublic void complete() throws Exception String taskId = 1102;/ 完成任務(wù)processEngine.getTaskService()/ plete(taskId);/指定任務(wù)ID,完成任務(wù)北京傳智播

38、客教育 流程實(shí)例的執(zhí)行查看流程狀態(tài)(判斷流程是正在執(zhí)行,還是已經(jīng)結(jié)束):Testpublic void queryProcessState() throws Exception String processInstanceId=1201;/ 通過(guò)流程實(shí)例ID查詢流程實(shí)例ProcessInstance pi = processEngine.getRuntimeService().createProcessInstanceQuery()/創(chuàng)建流程實(shí)例查詢,查詢正在執(zhí)行的流程實(shí)例.processInstanceId(processInstanceId)/按照流程實(shí)例ID查詢.singleResult

39、();/返回惟一的結(jié)果集if(pi!=null)System.out.println(當(dāng)前流程在: + pi.getActivitiId();elseSystem.out.println(流程已結(jié)束!);北京傳智播客教育 流程實(shí)例的執(zhí)行查詢歷史任務(wù):Testpublic void queryHistoryTask() throws Exception /歷史任務(wù)辦理人String taskAssignee=張三;/ 使用辦理人查詢流程實(shí)例List list = processEngine.getHistoryService()/.createHistoricTaskInstanceQuery(

40、)/創(chuàng)建歷史任務(wù)查詢.taskAssignee(taskAssignee)/指定辦理人查詢歷史任務(wù).list();if(list!=null & list.size()0) for(HistoricTaskInstance task:list) System.out.println(任務(wù)ID:+task.getId(); System.out.println(流程實(shí)例ID:+task.getProcessInstanceId(); System.out.println(任務(wù)的辦理人:+task.getAssignee(); System.out.println(執(zhí)行對(duì)象ID:+task.get

41、ExecutionId(); System.out.println(task.getStartTime()+task.getEndTime()+task.getDurationInMillis();北京傳智播客教育 流程實(shí)例的執(zhí)行查詢歷史的流程實(shí)例:Testpublic void queryHistoryProcessInstance() throws Exception String processInstanceId = 1201;HistoricProcessInstance hpi = processEngine.getHistoryService()/ .createHistoric

42、ProcessInstanceQuery()/創(chuàng)建歷史流程實(shí)例查詢 .processInstanceId(processInstanceId)/使用流程實(shí)例ID查詢 .singleResult();System.out.println(流程定義ID:+hpi.getProcessDefinitionId();System.out.println(流程實(shí)例ID:+hpi.getId();System.out.println(hpi.getStartTime()+hpi.getEndTime()+ +hpi.getDurationInMillis();北京傳智播客教育 流程實(shí)例的執(zhí)行流程實(shí)例涉及的

43、概念,及涉及到數(shù)據(jù)庫(kù)表Execution 執(zhí)行對(duì)象 按流程定義的規(guī)則執(zhí)行一次的過(guò)程. 對(duì)應(yīng)的表: act_ru_execution: 正在執(zhí)行的信息 act_hi_procinst:已經(jīng)執(zhí)行完的歷史流程實(shí)例信息 act_hi_actinst:存放歷史所有完成的活動(dòng)ProcessInstance 流程實(shí)例 特指流程從開(kāi)始到結(jié)束的那個(gè)最大的執(zhí)行分支,一個(gè)執(zhí)行的流程中,流程實(shí)例只有1個(gè)。注意 (1)如果是單例流程,執(zhí)行對(duì)象ID就是流程實(shí)例ID (2)如果一個(gè)流程有分支和聚合,那么執(zhí)行對(duì)象ID和流程實(shí)例ID就不相同 (3)一個(gè)流程中,流程實(shí)例只有1個(gè),執(zhí)行對(duì)象可以存在多個(gè)。Task 任務(wù) 執(zhí)行到某任務(wù)

44、環(huán)節(jié)時(shí)生成的任務(wù)信息。 對(duì)應(yīng)的表: act_ru_task:正在執(zhí)行的任務(wù)信息 act_hi_taskinst:已經(jīng)執(zhí)行完的歷史任務(wù)信息北京傳智播客教育 第四章:流程變量北京傳智播客教育 流程變量流程圖北京傳智播客教育 流程變量概念流程變量在整個(gè)工作流中扮演很重要的作用。例如:請(qǐng)假流程中有請(qǐng)假天數(shù)、請(qǐng)假原因等一些參數(shù)都為流程變量的范圍。流程變量的作用域范圍是流程實(shí)例。也就是說(shuō)各個(gè)流程實(shí)例的流程變量是不相互影響的。流程實(shí)例結(jié)束完成以后流程變量還保存在數(shù)據(jù)庫(kù)中。 提交申請(qǐng)經(jīng)理審批設(shè)置流程變量(名稱/值)獲取流程變量(針對(duì)流程變量的名稱,獲取流程變量的值北京傳智播客教育 流程變量輸入流加載資源文件的

45、3種方式InputStream inputStream= this.getClass().getClassLoader().getResourceAsStream(diagrams/testVariables.bpmn);InputStream inputStreamPng= this.getClass().getClassLoader().getResourceAsStream(diagrams/testVariables.png);InputStream inputStream= this.getClass().getResourceAsStream(testVariables.bpmn)

46、;InputStream inputStreamPng= this.getClass().getResourceAsStream(testVariables.png);InputStream inputStream= this.getClass().getResourceAsStream(/diagrams/testVariables.bpmn);InputStream inputStreamPng= this.getClass().getResourceAsStream(/diagrams/testVariables.png); * this.getClass().getClassLoade

47、r().getResourceAsStream(testVariables.bpmn) 從classpath根目錄下加載指定名稱的文件 * this.getClass().getResourceAsStream(testVariables.bpmn) 從當(dāng)前包下加載指定名稱的文件 * this.getClass().getResourceAsStream(/testVariables.bpmn) 從classpath根目錄下加載指定名稱的文件北京傳智播客教育 流程變量/*部署流程定義*/Testpublic void deploy_inputstream() throws Exception

48、InputStream inputStream= this.getClass().getResourceAsStream(/diagrams/testVariables.bpmn);InputStream inputStreamPng= this.getClass().getResourceAsStream(/diagrams/testVariables.png);Deployment deployment = processEngine.getRepositoryService().createDeployment().name(審批流程(流程變量)).addInputStream(test

49、Variables.bpmn, inputStream).addInputStream(testVariables.png, inputStreamPng).deploy();/ 發(fā)布流程System.out.println(deployment.getId()+deployment.getName();部署流程定義:北京傳智播客教育 流程變量/啟動(dòng)流程Testpublic void startProcess() throws Exception String processDefinitionKey =myProcess;/ 在啟動(dòng)時(shí)設(shè)置流程變量ProcessInstance pi = pr

50、ocessEngine.getRuntimeService() .startProcessInstanceByKey(processDefinitionKey );System.out.println(pid: + pi.getId();啟動(dòng)流程實(shí)例:北京傳智播客教育 流程變量設(shè)置流程變量:/*設(shè)置流程變量*/Testpublic void setVariables()/獲取執(zhí)行的ServiceTaskService taskService = processEngine.getTaskService();/指定辦理人String assigneeUser = 張三;/流程實(shí)例IDString

51、 processInstanceId = 1701;Task task = taskService.createTaskQuery()/創(chuàng)建任務(wù)查詢.taskAssignee(assigneeUser)/指定辦理人.processInstanceId(processInstanceId)/指定流程實(shí)例ID.singleResult();/*一:變量中存放基本數(shù)據(jù)類型*/taskService.setVariable(task.getId(), 請(qǐng)假人, 張無(wú)忌);/使用流程變量的名稱和流程變量的值設(shè)置流程變量,一次只能設(shè)置一個(gè)值/taskService.setVariable(task.get

52、Id(), 請(qǐng)假天數(shù), 3);/taskService.setVariable(task.getId(), 請(qǐng)假日期, new Date();/*二:變量中存放javabean對(duì)象,前提:讓javabean對(duì)象實(shí)現(xiàn)implements java.io.Serializable*/Person p = new Person();p.setId(1L);p.setName(翠花);taskService.setVariable(task.getId(), 人員信息, p);注意:Object對(duì)象需要實(shí)現(xiàn):implements java.io.Serializable北京傳智播客教育 流程變量獲取流

53、程變量:/*獲取流程變量*/Testpublic void getVariables()/獲取執(zhí)行的ServiceTaskService taskService = processEngine.getTaskService();/指定辦理人String assigneeUser = 張三;/流程實(shí)例IDString processInstanceId = 1701;Task task = taskService.createTaskQuery()/創(chuàng)建任務(wù)查詢.taskAssignee(assigneeUser)/指定辦理人.processInstanceId(processInstanceI

54、d)/指定流程實(shí)例ID.singleResult();/*一:變量中存放基本數(shù)據(jù)類型*/String stringValue = (String) taskService.getVariable(task.getId(), 請(qǐng)假人);/Integer integerValue = (Integer) taskService.getVariable(task.getId(), 請(qǐng)假天數(shù));/Date dateValue = (Date) taskService.getVariable(task.getId(), 請(qǐng)假日期);/System.out.println(stringValue+ +in

55、tegerValue+ +dateValue);/*二:變量中存放javabean對(duì)象,前提:讓javabean對(duì)象實(shí)現(xiàn)implements java.io.Serializable*/* * 獲取流程變量時(shí)注意:流程變量如果是javabean對(duì)象,除了要求實(shí)現(xiàn)Serializable之外, * 同時(shí)要求流程變量對(duì)象的屬性不能發(fā)生發(fā)生變化,否則拋出異常 * 解決方案:在設(shè)置流程變量的時(shí)候,在javabean的對(duì)象中使用: * private static final long serialVersionUID = - 2L; */Person p = (Person)taskService.g

56、etVariable(task.getId(), 人員信息);System.out.println(p.getId();System.out.println(p.getName();北京傳智播客教育 流程變量流程變量設(shè)置和獲取實(shí)例場(chǎng)景:RuntimeService runtimeService = processEngine.getRuntimeService();TaskService taskService = processEngine.getTaskService();/ =/ 設(shè)置變量的方法/ 通過(guò)Execution設(shè)置一個(gè)變量runtimeService.setVariable(e

57、xecutionId, name, value);/ 通過(guò)Execution設(shè)置多個(gè)變量runtimeService.setVariables(executionId, variablesMap);/ 通過(guò)Task設(shè)置一個(gè)變量taskService.setVariable(taskId, variableName, value);/ 通過(guò)Task設(shè)置多個(gè)變量taskService.setVariables(taskId, variablesMap);/ 在啟動(dòng)流程實(shí)例時(shí),同時(shí)也設(shè)置一些流程變量runtimeService.startProcessInstanceByKey(processDef

58、initionKey, variables);/ 在完成任務(wù)時(shí),同時(shí)也設(shè)置一些流程變量 plete(taskId, variables);/ =/ 獲取變量的方法/ 通過(guò)Execution獲取一個(gè)變量runtimeService.getVariable(executionId, variableName);/ 通過(guò)Execution獲取所有變量的信息,存放到Map集合中runtimeService.getVariables(executionId);/ 通過(guò)Execution獲取指定流程變量名稱的變量值的信息,存放到Map集合中runtimeService.getVariables(execu

59、tionId, variableNames);/ 通過(guò)Task獲取一個(gè)變量taskService.getVariable(taskId, variableName);/ 通過(guò)Task獲取所有變量的信息,存放到Map集合中taskService.getVariables(taskId);/ 通過(guò)Task獲取指定流程變量名稱的變量值的信息,存放到Map集合中taskService.getVariables(taskId, variableNames);北京傳智播客教育 流程變量擴(kuò)展知識(shí):setVariable和setVariableLocal的區(qū)別setVariable:設(shè)置流程變量的時(shí)候,流程變

60、量名稱相同的時(shí)候,后一次的值替換前一次的值setVariableLocal:設(shè)置流程變量的時(shí)候,針對(duì)當(dāng)前活動(dòng)的節(jié)點(diǎn)設(shè)置流程變量,如果一個(gè)流程中存在2個(gè)活動(dòng)節(jié)點(diǎn),對(duì)每個(gè)活動(dòng)節(jié)點(diǎn)都設(shè)置流程變量,即使流程變量的名稱相同,后一次的版本的值也不會(huì)替換前一次版本的值,它會(huì)使用不同的任務(wù)ID作為標(biāo)識(shí),存放2個(gè)流程變量值。例如act_hi_varinst 表的數(shù)據(jù):不同的任務(wù)節(jié)點(diǎn),即使流程變量名稱相同,存放的值也是不同的。獲取歷史流程變量值的方法:Testpublic void getHisVariables()List list = processEngine.getHistoryService()/.cr

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論