多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內(nèi)最全IT社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當前位置:首頁 > php開源 > 綜合技術(shù) > 工作流框架Activiti常用功能初探

工作流框架Activiti常用功能初探

來源:程序員人生   發(fā)布時間:2016-07-13 08:26:49 閱讀次數(shù):3238次

Activiti項目是1項新的基于Apache許可的開源BPM平臺,從基礎開始構(gòu)建,旨在提供支持新的BPMN 2.0標準,包括支持對象管理組(OMG),面對新技術(shù)的機遇,諸如互操作性和云架構(gòu),提供技術(shù)實現(xiàn)。

BPMN是由BPMI(The Business Process Management Initiative)開發(fā)了1套標準叫業(yè)務流程建模符號(BPMN - Business Process Modeling Notation)BPMN定義了1個業(yè)務流程圖(Business Process Diagram),該業(yè)務流程圖基于1個流程圖(flowcharting),該流程圖被設計用于創(chuàng)建業(yè)務流程操作的圖形化模型。而1個業(yè)務流程模型(Business Process Model),指1個由的圖形對象(graphical objects)組成的網(wǎng)狀圖,圖形對象包括活動(acticities)和用于定義這些活動履行順序的流程控制器(flow controls)。

以下是對Activiti框架幾個經(jīng)常使用功能的測試。

環(huán)境:mysql,eclipse,jdk1.7,activiti5.13

首先將Activiti相干的JAR包導入到項目中,由于JAR眾多,這里就不羅列了。主要記錄代碼部份。

1.在eclipse中安裝Activiti插件

Help -> InstallNew Software,在以下Install界面板中,點擊Add按鈕

然后在Name和Location中分別填入以下內(nèi)容:

Name: Activiti BPMN 2.0 designer

Location: http://activiti.org/designer/update/

然后1直下1步、下1步安裝,根據(jù)提示重啟eclipse


重啟后,再打開菜單Windows->Preferences->Activiti->Save下流程流程圖片的生成方式



2.配置log4j,讓其打印出sql語句

在項目根目錄下創(chuàng)建log4j.properties文件,在此文件中輸入以下配置信息
### direct log messages to stdout ### log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.err log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n ### direct messages to file mylog.log ### log4j.appender.file=org.apache.log4j.FileAppender log4j.appender.file.File=c:\mylog.log log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n ### set log levels - for more verbose logging change 'info' to 'debug' ### log4j.rootLogger=debug, stdout

3.activiti-context.xml配置activiti

在項目根目錄創(chuàng)建activiti-context.xml文件,在其中配置以下內(nèi)容
其中的activitiStudy數(shù)據(jù)庫名,須自己提早創(chuàng)建好。
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context⑵.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx⑶.0.xsd"> <!-- 配置流程引擎配置對象 --> <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration"> <property name="jdbcDriver" value="com.mysql.jdbc.Driver" /> <property name="jdbcUrl" value="jdbc:mysql:///activitiStudy?useUnicode=true&characterEncoding=UTF⑻"/> <property name="jdbcUsername" value="root" /> <property name="jdbcPassword" value="root" /> <property name="databaseSchemaUpdate" value="true" /> </bean> <!-- 配置1個流程引擎工廠bean,用于創(chuàng)建流程引擎對象 --> <bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean"> <!-- 通過set方法注入流程引擎配置對象 --> <property name="processEngineConfiguration" ref="processEngineConfiguration" /> </bean> </beans>

4.畫流程圖

在項目中,在項目根目錄下,點擊new->other->選擇Activiti下的Activiti Diagram新建1個流程圖。

在其中畫以下圖示

并設好相干屬性



5.Activiti測試代碼

import java.io.File; import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.activiti.engine.repository.Deployment; import org.activiti.engine.repository.DeploymentBuilder; import org.activiti.engine.repository.DeploymentQuery; import org.activiti.engine.repository.ProcessDefinition; import org.activiti.engine.repository.ProcessDefinitionQuery; import org.activiti.engine.runtime.ProcessInstance; import org.activiti.engine.runtime.ProcessInstanceQuery; import org.activiti.engine.task.Task; import org.activiti.engine.task.TaskQuery; import org.apache.commons.io.FileUtils; import org.junit.Test; /** * 使用Activiti框架的API操作流程 * * @author PuHaiyang * @createTime 2016年6月28日 下午4:50:39 * @email 761396462@qq.com * @function Activiti基本功能測試 * */ public class MyActivitiAPITest { ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); @Test public void deployActiviti() { // 如果之前沒有創(chuàng)建activiti相干的表,調(diào)用它會自動創(chuàng)建,由activiti-context.xml文件內(nèi)容創(chuàng)建 DeploymentBuilder deploymentBuilder = processEngine.getRepositoryService().createDeployment(); deploymentBuilder.addClasspathResource("MyTest.bpmn"); deploymentBuilder.addClasspathResource("MyTest.png"); deploymentBuilder.name("i_am_name"); Deployment deploy = deploymentBuilder.deploy(); System.out.println(deploy.getId()); // 部署信息表 insert into ACT_RE_DEPLOYMENT(ID_, NAME_, CATEGORY_, // DEPLOY_TIME_) values(?, ?, ?, ?) // 2進制數(shù)據(jù)表,bpmn文件插入 insert into ACT_GE_BYTEARRAY(ID_, REV_, NAME_, // BYTES_, DEPLOYMENT_ID_, GENERATED_) values (?, 1, ?, ?, ?, ?) // 2進制數(shù)據(jù)表,png文件插入 insert into ACT_GE_BYTEARRAY(ID_, REV_, NAME_, BYTES_, // DEPLOYMENT_ID_, GENERATED_) values (?, 1, ?, ?, ?, ?) // 流程定義數(shù)據(jù)表 insert into ACT_RE_PROCDEF(ID_, REV_, CATEGORY_, NAME_, KEY_, // VERSION_, DEPLOYMENT_ID_, RESOURCE_NAME_, DGRM_RESOURCE_NAME_, // DESCRIPTION_, HAS_START_FORM_KEY_, SUSPENSION_STATE_) values (?, 1, // ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) } /** * 查詢部署列表 */ @Test public void queryDeployment() { DeploymentQuery deploymentQuery = processEngine.getRepositoryService().createDeploymentQuery(); List<Deployment> list = deploymentQuery.list(); for (Deployment deployment : list) { String id = deployment.getId(); System.out.println(id); } } /** * 刪除部署信息 */ @Test public void deleteDeployment() { String deploymentId = "1"; // 第2個參數(shù)代表級聯(lián)操作 processEngine.getRepositoryService().deleteDeployment(deploymentId, true); // 刪除所有相干的activiti信息 } /** * 查詢1次部署對應的流程定義文件名稱和對應的輸入流(bpmn png) * * @throws Exception */ @Test public void queryDeploymentResource() throws Exception { String deploymentId = "101"; List<String> names = processEngine.getRepositoryService().getDeploymentResourceNames(deploymentId); for (String name : names) { System.out.println(name); InputStream in = processEngine.getRepositoryService().getResourceAsStream(deploymentId, name); // 將文件保存到本地磁盤 // FileUtils來自commons-io-xxx.jar FileUtils.copyInputStreamToFile(in, new File("d:\\" + name)); in.close(); } } /** * 取得流程表中流程圖 * * @throws Exception */ @Test public void getProcessDiagream() throws Exception { String processDefinitionId = "myProcess:1:104"; InputStream pngInputStream = processEngine.getRepositoryService().getProcessDiagram(processDefinitionId); FileUtils.copyInputStreamToFile(pngInputStream, new File("d:\\my.png")); } /** * 啟動流程實例 <br> * 方式1:根據(jù)流程定義的id啟動 <br> * 方式2:根據(jù)流程定義的key啟動(自動選擇最新版本的流程定義啟動流程實例) */ @Test public void startProcess() { /* * 方式1:根據(jù)流程定義的id啟動 String processDefinitionId = "myProcess:1:104"; * ProcessInstance processInstance = * processEngine.getRuntimeService().startProcessInstanceById * (processDefinitionId ); System.out.println(processInstance.getId()); */ // 方式2:根據(jù)流程定義的key啟動(自動選擇最新版本的流程定義啟動流程實例) String processDefinitionKey = "myProcess"; ProcessInstance processInstance = processEngine.getRuntimeService() .startProcessInstanceByKey(processDefinitionKey); System.out.println(processInstance.getId()); // 調(diào)用SQL語句以下 // 1 ACT_RU_EXECUTION 運行時流程履行實例表 // insert into ACT_RU_EXECUTION (ID_, REV_, PROC_INST_ID_, // BUSINESS_KEY_, PROC_DEF_ID_, ACT_ID_, IS_ACTIVE_, IS_CONCURRENT_, // IS_SCOPE_,IS_EVENT_SCOPE_, PARENT_ID_, SUPER_EXEC_, // SUSPENSION_STATE_, CACHED_ENT_STATE_) values ( ?, 1, ?, ?, ?, ?, ?, // ?, ?, ?, ?, ?, ?, ? ) // 2 ACT_HI_PROCINST 歷史流程實例表 // insert into ACT_HI_PROCINST ( ID_, PROC_INST_ID_, BUSINESS_KEY_, // PROC_DEF_ID_, START_TIME_, END_TIME_, DURATION_, START_USER_ID_, // START_ACT_ID_, END_ACT_ID_, SUPER_PROCESS_INSTANCE_ID_, // DELETE_REASON_ ) values ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) // 3 ACT_HI_ACTINST 歷史節(jié)點表 // insert into ACT_HI_ACTINST ( ID_, PROC_DEF_ID_, PROC_INST_ID_, // EXECUTION_ID_, ACT_ID_, TASK_ID_, CALL_PROC_INST_ID_, ACT_NAME_, // ACT_TYPE_, ASSIGNEE_, START_TIME_, END_TIME_, DURATION_ ) values ( ?, // ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) // 4 ACT_HI_ACTINST 歷史節(jié)點表 // insert into ACT_HI_ACTINST ( ID_, PROC_DEF_ID_, PROC_INST_ID_, // EXECUTION_ID_, ACT_ID_, TASK_ID_, CALL_PROC_INST_ID_, ACT_NAME_, // ACT_TYPE_, ASSIGNEE_, START_TIME_, END_TIME_, DURATION_ ) values ( ?, // ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) // 5 ACT_RU_TASK 運行時任務節(jié)點表 // insert into ACT_RU_TASK (ID_, REV_, NAME_, PARENT_TASK_ID_, // DESCRIPTION_, PRIORITY_, CREATE_TIME_, OWNER_, ASSIGNEE_, // DELEGATION_, EXECUTION_ID_, PROC_INST_ID_, PROC_DEF_ID_, // TASK_DEF_KEY_, DUE_DATE_, SUSPENSION_STATE_) values (?, 1, ?, ?, ?, // ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) // 6 ACT_HI_TASKINST 歷史任務實例表 // insert into ACT_HI_TASKINST ( ID_, PROC_DEF_ID_, PROC_INST_ID_, // EXECUTION_ID_, NAME_, PARENT_TASK_ID_, DESCRIPTION_, OWNER_, // ASSIGNEE_, START_TIME_, CLAIM_TIME_, END_TIME_, DURATION_, // DELETE_REASON_, TASK_DEF_KEY_, FORM_KEY_, PRIORITY_, DUE_DATE_ ) // values ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) // 7 ACT_RU_IDENTITYLINK 運行時流程人員表,主要存儲任務節(jié)點與參與者的相干信息 // insert into ACT_RU_IDENTITYLINK (ID_, REV_, TYPE_, USER_ID_, // GROUP_ID_, TASK_ID_, PROC_INST_ID_, PROC_DEF_ID_) values (?, 1, ?, ?, // ?, ?, ?, ?) // 8 ACT_HI_IDENTITYLINK 歷史流程人員表 // insert into ACT_HI_IDENTITYLINK (ID_, TYPE_, USER_ID_, GROUP_ID_, // TASK_ID_, PROC_INST_ID_) values (?, ?, ?, ?, ?, ?) } /** * 查詢流程實例列表,查詢act_ru_execution表 */ @Test public void queryRuntimeProcess() { // 流程實例查詢對象,查詢act_ru_execution表 ProcessInstanceQuery query = processEngine.getRuntimeService().createProcessInstanceQuery(); query.processDefinitionKey("myProcess"); query.orderByProcessInstanceId().desc(); query.listPage(0, 2); List<ProcessInstance> list = query.list(); for (ProcessInstance pi : list) { System.out.println(pi.getId() + " " + pi.getActivityId()); } } /** * 不通過<br> * 刪除流程實例 */ @Test public void deleteProcess() { String processInstanceId = "201"; processEngine.getRuntimeService().deleteProcessInstance(processInstanceId, "不準逃課!"); // 履行刪除部份SQL以下 // 1 ACT_RU_TASK 運行時任務節(jié)點表 // delete from ACT_RU_TASK where ID_ = ? and REV_ = ? // 2 ACT_RU_IDENTITYLINK 運行時流程人員表,主要存儲任務節(jié)點與參與者的相干信息 // delete from ACT_RU_IDENTITYLINK where ID_ = ? // 3 ACT_RU_EXECUTION 運行時流程履行實例表 // delete from ACT_RU_EXECUTION where ID_ = ? and REV_ = ? // 履行更新部份SQL以下 // 1 ACT_HI_PROCINST 歷史流程實例表 // update ACT_HI_PROCINST set PROC_DEF_ID_ = ?, START_TIME_ = ?, // END_TIME_ = ?, DURATION_ = ?, END_ACT_ID_ = ?, DELETE_REASON_ = ? // where ID_ = ? // 2 ACT_HI_ACTINST 歷史節(jié)點表 // update ACT_HI_ACTINST set EXECUTION_ID_ = ?, ASSIGNEE_ = ?, END_TIME_ // = ?, DURATION_ = ? where ID_ = ? // 3 ACT_HI_TASKINST 歷史任務實例表 // update ACT_HI_TASKINST set EXECUTION_ID_ = ?, NAME_ = ?, // PARENT_TASK_ID_ = ?, DESCRIPTION_ = ?, OWNER_ = ?, ASSIGNEE_ = ?, // CLAIM_TIME_ = ?, END_TIME_ = ?, DURATION_ = ?, DELETE_REASON_ = ?, // TASK_DEF_KEY_ = ?, FORM_KEY_ = ?, PRIORITY_ = ?, DUE_DATE_ = ? where // ID_ = ? } /** * 查詢?nèi)蝿? */ @Test public void queryTask() { // 任務查詢對象,查詢act_ru_task表 TaskQuery query = processEngine.getTaskService().createTaskQuery(); String assignee = "班主任"; query.taskAssignee(assignee); query.orderByTaskCreateTime().desc(); List<Task> list = query.list(); for (Task task : list) { System.out.println(task.getId()); } // 履行sql以下 // 1 ACT_GE_PROPERTY 屬性數(shù)據(jù)表存儲全部流程引擎級別的數(shù)據(jù),初始化表結(jié)構(gòu)時,會默許插入3條記錄, // select * from ACT_GE_PROPERTY where NAME_ = ? // 2 ACT_RU_TASK 運行時任務節(jié)點表 // select distinct RES.* from ACT_RU_TASK RES WHERE RES.ASSIGNEE_ = ? // order by RES.CREATE_TIME_ desc LIMIT ? OFFSET ? } /** * 處理任務 */ @Test public void completeTask() { String taskId = "304"; processEngine.getTaskService().complete(taskId); // 履行的主要SQL以下 // 1 ACT_GE_PROPERTY 屬性數(shù)據(jù)表存儲全部流程引擎級別的數(shù)據(jù),初始化表結(jié)構(gòu)時,會默許插入3條記錄 // update ACT_GE_PROPERTY SET REV_ = ?, VALUE_ = ? where NAME_ = ? and // REV_ = ? // 2 ACT_HI_ACTINST 歷史節(jié)點表 // insert into ACT_HI_ACTINST ( ID_, PROC_DEF_ID_, PROC_INST_ID_, // EXECUTION_ID_, ACT_ID_, TASK_ID_, CALL_PROC_INST_ID_, ACT_NAME_, // ACT_TYPE_, ASSIGNEE_, START_TIME_, END_TIME_, DURATION_ ) values ( ?, // ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) // 3 ACT_RU_TASK 運行時任務節(jié)點表 // insert into ACT_RU_TASK (ID_, REV_, NAME_, PARENT_TASK_ID_, // DESCRIPTION_, PRIORITY_, CREATE_TIME_, OWNER_, ASSIGNEE_, // DELEGATION_, EXECUTION_ID_, PROC_INST_ID_, PROC_DEF_ID_, // TASK_DEF_KEY_, DUE_DATE_, SUSPENSION_STATE_) values (?, 1, ?, ?, ?, // ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) // 4 ACT_HI_TASKINST 歷史任務實例表 // insert into ACT_HI_TASKINST ( ID_, PROC_DEF_ID_, PROC_INST_ID_, // EXECUTION_ID_, NAME_, PARENT_TASK_ID_, DESCRIPTION_, OWNER_, // ASSIGNEE_, START_TIME_, CLAIM_TIME_, END_TIME_, DURATION_, // DELETE_REASON_, TASK_DEF_KEY_, FORM_KEY_, PRIORITY_, DUE_DATE_ ) // values ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) // 5 ACT_RU_IDENTITYLINK 運行時流程人員表,主要存儲任務節(jié)點與參與者的相干信息 // insert into ACT_RU_IDENTITYLINK (ID_, REV_, TYPE_, USER_ID_, // GROUP_ID_, TASK_ID_, PROC_INST_ID_, PROC_DEF_ID_) values (?, 1, ?, ?, // ?, ?, ?, ?) // 6 ACT_HI_IDENTITYLINK 歷史流程人員表 // insert into ACT_HI_IDENTITYLINK (ID_, TYPE_, USER_ID_, GROUP_ID_, // TASK_ID_, PROC_INST_ID_) values (?, ?, ?, ?, ?, ?) // 7 ACT_HI_TASKINST 歷史任務實例表 // update ACT_HI_TASKINST set EXECUTION_ID_ = ?, NAME_ = ?, // PARENT_TASK_ID_ = ?, DESCRIPTION_ = ?, OWNER_ = ?, ASSIGNEE_ = ?, // CLAIM_TIME_ = ?, END_TIME_ = ?, DURATION_ = ?, DELETE_REASON_ = ?, // TASK_DEF_KEY_ = ?, FORM_KEY_ = ?, PRIORITY_ = ?, DUE_DATE_ = ? where // ID_ = ? // 8 ACT_RU_EXECUTION 運行時流程履行實例表 // update ACT_RU_EXECUTION set REV_ = ?, PROC_DEF_ID_ = ?, ACT_ID_ = ?, // IS_ACTIVE_ = ?, IS_CONCURRENT_ = ?, IS_SCOPE_ = ?, IS_EVENT_SCOPE_ = // ?, PARENT_ID_ = ?, SUPER_EXEC_ = ?, SUSPENSION_STATE_ = ?, // CACHED_ENT_STATE_ = ? where ID_ = ? and REV_ = ? // 9 ACT_HI_ACTINST 歷史節(jié)點表 // update ACT_HI_ACTINST set EXECUTION_ID_ = ?, ASSIGNEE_ = ?, END_TIME_ // = ?, DURATION_ = ? where ID_ = ? // 10 ACT_RU_TASK 運行時任務節(jié)點表 // delete from ACT_RU_TASK where ID_ = ? and REV_ = ? } /** * 直接將流程向下履行1步 */ @Test public void signal() { String executionId = "301";// 流程實例id processEngine.getRuntimeService().signal(executionId); } /** * 查詢最新版本的流程定義列表 */ @Test public void getLastTasks() { ProcessDefinitionQuery query = processEngine.getRepositoryService().createProcessDefinitionQuery(); query.orderByProcessDefinitionVersion().asc(); List<ProcessDefinition> list = query.list(); Map<String, ProcessDefinition> map = new HashMap<String, ProcessDefinition>(); for (ProcessDefinition pd : list) { map.put(pd.getKey(), pd); } ArrayList<ProcessDefinition> lastList = new ArrayList<>(map.values()); for (ProcessDefinition processDefinition : lastList) { System.out.println(processDefinition.getName() + " " + processDefinition.getVersion()); } } }



生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: www.日本免费| 国产成人a v在线影院 | 亚洲精品视频久久久 | 成人精品一区二区三区校园激情 | 日韩一级在线播放免费观看 | 在线观看成年人视频 | 久久久亚洲欧洲国产 | 国产一区曰韩二区欧美三区 | www.午夜视频| 亚洲欧美日韩国产综合 | 日韩亚洲国产综合久久久 | 日本高清免费中文字幕不卡 | 亚洲精品一区二区 | 精品伊人久久久大香线蕉欧美 | 97精品一区二区三区在线不卡 | 中文字幕一区二区三区精彩视频 | 国产美女视频一区二区二三区 | 日本欧美一区二区三区不卡视频 | 精品在线观看免费 | 特级aav毛片日本免费视频 | 国产成人精品第一区二区 | 五月综合视频 | 国产精品视频流白浆免费视频 | 俄罗斯精品18videosex性 | 午夜在线a亚洲v天堂网2019 | 午夜欧美精品久久久久久久 | 九九精品免视频国产成人 | 依人久久| 欧美做爰孕妇群 | 毛片免费观看网址 | 午夜精品久久久 | 日韩欧美亚洲一区精选 | 亚洲高清视频在线播放 | 久久天天 | 狠狠躁天天躁 | 日本特黄特色aa大片免费 | 波多野结中文字幕在线69视频 | 久久久久嫩草影院精品 | 夜夜狠狠狠狠 | 国产激情一区二区三区 | 亚洲欧美在线播放 |