国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Activiti工作流簡單入門

2019-11-08 02:40:37
字體:
來源:轉載
供稿:網友
自jBPM創始人Tom離開之后,jBPM和Activiti就開始大相徑庭,jBPM被迫使用新的LGPL協議,而Activiti則使用一種更為寬松的Apache License 2.0協議。不管使用jBPM還是Activiti,兩者都遵循BPMN 2.0規范,都可滿足項目的一般需求,相比于jBPM,Activiti使用起來不會進行太大的二次改動,但jBPM則是使用Drools較為強大的規則引擎作為后盾,至于兩者誰優誰劣,需要在實際項目中權衡利弊。

BPMN 2.0

BPMN最初由業務流程倡議組織(BPMI)定案,現在BPMI并入到OMG(Object Management Group)了,則由OMG建立規范和維護。

BPMN 2.0正式更名為(Business PRocess Model And Notation)業務流程符號和模型,也有人繼續稱呼為業務流程建模標記法(Business Process Modeling Notaion),不過無所謂,不管是jBPM、Activiti還是國人開發的FixFlow,都遵循BPMN規范。

Maven配置

JBoss的開源框架都是比較龐大的,不過相對Activiti體積要小一點。下面為配置的依賴項。

<!--Junit--><dependency>    <groupId>junit</groupId>    <artifactId>junit</artifactId>    <version>${junit.version}</version></dependency><!--activiti--><dependency>    <groupId>org.activiti</groupId>    <artifactId>activiti-engine</artifactId>    <version>${activiti.version}</version></dependency><dependency>    <groupId>org.activiti</groupId>    <artifactId>activiti-bpmn-layout</artifactId>    <version>${activiti.version}</version></dependency><dependency>    <groupId>org.activiti</groupId>    <artifactId>activiti-spring</artifactId>    <version>${activiti.version}</version></dependency><!--apache組件-->...

整合數據庫

為什么要整合數據庫?如果不整合數據庫,我們大可以使用Quartz這些框架來做流程任務。實際上,Work Flow是用于一種長周期的、幾乎異步的項目運行環境中,并且我們時刻需要將工作流程的狀態記錄下來,就是一種既注重結果,又注重過程的事務中,因此,整合數據庫很有必要。

下面為配置源數據的xml文件,并且將databaseSchemaUpdate屬性配置為drop-create,即在運行前刪除原有的數據內容。

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"       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">    <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">        <property name="databaseSchemaUpdate" value="drop-create"/>        <property name="jdbcUrl" value="jdbc:MySQL://localhost:3306/db_activiti?useUnicode=true&amp;characterEncoding=utf-8"/>        <property name="jdbcDriver" value="com.mysql.jdbc.Driver"/>        <property name="jdbcUsername" value="root"/>        <property name="jdbcPassWord" value="****"/>        <property name="jobExecutorActivate" value="true"/>    </bean></beans>

默認配置文件名為activiti.cfg.xml,可以在源文件中找到。

另外,如果有必要,請將MySQL設置為區分大小寫,即lower_case_table_names = 0。

數據內容會在運行前自動創建,詳細表結構內容可參考官網完整信息。

創建工作流文件

由于BPMN規范的作用,一些高級的IDE會自動識別后綴為*.bpmn的文件,不過這些都無所謂,bpmn文件實際上就是XML文件,只是加上了一些圖形的標記,如width、height、x和y的坐標,下面為一個招聘面試流程,只包含流程節點,不包含位置標記節點。

<?xml version="1.0" encoding="UTF-8"?><definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"             xmlns:activiti="http://activiti.org/bpmn"             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"             targetNamespace="Examples"             xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL             http://www.omg.org/spec/BPMN/2.0/20100501/BPMN20.xsd">    <process id="Interview" name="某公司2012年實習生招聘流程">        <documentation>招聘工作流程</documentation>        <startEvent id="start" name="實習生招聘啟動"/>        <userTask id="bishi" name="筆試" activiti:candidateGroups="人力資源部"/>        <sequenceFlow id="flow1" name="" sourceRef="start" targetRef="bishi"/>        <userTask id="yimian" name="技術一面" activiti:candidateGroups="技術部"/>        <sequenceFlow id="flow2" name="" sourceRef="bishi" targetRef="yimian"/>        <userTask id="ermian" name="技術二面" activiti:candidateGroups="技術部"/>        <sequenceFlow id="flow3" name="" sourceRef="yimian" targetRef="ermian"/>        <userTask id="hrmian" name="HR面" activiti:candidateGroups="人力資源部"/>        <sequenceFlow id="flow4" name="" sourceRef="ermian" targetRef="hrmian"/>        <userTask id="luyong" name="錄用,發放Offer" activiti:candidateGroups="人力資源部"/>        <sequenceFlow id="flow5" name="" sourceRef="hrmian" targetRef="luyong"/>        <endEvent id="end" name="實習生招聘結束"/>        <sequenceFlow id="flow6" name="" sourceRef="luyong" targetRef="end"/>    </process></definitions>

為了便于閱讀,一些高級IDE可以轉化為圖形符號,如下圖:

Activiti工作流簡單入門

測試運行

有了流程引擎的配置文件和流程文件后,就可以編寫代碼啟動流程引擎并加載該流程文件了。測試清單如下:

@Testpublic void processTests(){    // 加載配置文件    ProcessEngine processEngine = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml").buildProcessEngine();    RepositoryService repositoryService = processEngine.getRepositoryService();    RuntimeService runtimeService = processEngine.getRuntimeService();    repositoryService.createDeployment().addClasspathResource("Interview.bpmn").deploy();    String processId = runtimeService.startProcessInstanceByKey("Interview").getId();    TaskService taskService = processEngine.getTaskService();    //得到筆試的流程    System.out.println("/n***************筆試流程開始***************");    List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup("人力資源部").list();    for (Task task : tasks) {        System.out.println("人力資源部的任務:name:"+task.getName()+",id:"+task.getId());        taskService.claim(task.getId(), "張三");    }    System.out.println("張三的任務數量:"+taskService.createTaskQuery().taskAssignee("張三").count());    tasks = taskService.createTaskQuery().taskAssignee("張三").list();    for (Task task : tasks) {        System.out.println("張三的任務:name:"+task.getName()+",id:"+task.getId());        taskService.complete(task.getId());    }    System.out.println("張三的任務數量:"+taskService.createTaskQuery().taskAssignee("張三").count());    System.out.println("***************筆試流程結束***************");    System.out.println("/n***************一面流程開始***************");    tasks = taskService.createTaskQuery().taskCandidateGroup("技術部").list();    for (Task task : tasks) {        System.out.println("技術部的任務:name:"+task.getName()+",id:"+task.getId());        taskService.claim(task.getId(), "李四");    }    System.out.println("李四的任務數量:"+taskService.createTaskQuery().taskAssignee("李四").count());    for (Task task : tasks) {        System.out.println("李四的任務:name:"+task.getName()+",id:"+task.getId());        taskService.complete(task.getId());    }    System.out.println("李四的任務數量:"+taskService.createTaskQuery().taskAssignee("李四").count());    System.out.println("***************一面流程結束***************");    System.out.println("/n***************二面流程開始***************");    tasks = taskService.createTaskQuery().taskCandidateGroup("技術部").list();    for (Task task : tasks) {        System.out.println("技術部的任務:name:"+task.getName()+",id:"+task.getId());        taskService.claim(task.getId(), "李四");    }    System.out.println("李四的任務數量:"+taskService.createTaskQuery().taskAssignee("李四").count());    for (Task task : tasks) {        System.out.println("李四的任務:name:"+task.getName()+",id:"+task.getId());        taskService.complete(task.getId());    }    System.out.println("李四的任務數量:"+taskService.createTaskQuery().taskAssignee("李四").count());    System.out.println("***************二面流程結束***************");    System.out.println("***************HR面流程開始***************");    tasks = taskService.createTaskQuery().taskCandidateGroup("人力資源部").list();    for (Task task : tasks) {        System.out.println("技術部的任務:name:"+task.getName()+",id:"+task.getId());        taskService.claim(task.getId(), "李四");    }    System.out.println("李四的任務數量:"+taskService.createTaskQuery().taskAssignee("李四").count());    for (Task task : tasks) {        System.out.println("李四的任務:name:"+task.getName()+",id:"+task.getId());        taskService.complete(task.getId());    }    System.out.println("李四的任務數量:"+taskService.createTaskQuery().taskAssignee("李四").count());    System.out.println("***************HR面流程結束***************");    System.out.println("/n***************錄用流程開始***************");    tasks = taskService.createTaskQuery().taskCandidateGroup("人力資源部").list();    for (Task task : tasks) {        System.out.println("技術部的任務:name:"+task.getName()+",id:"+task.getId());        taskService.claim(task.getId(), "李四");    }    System.out.println("李四的任務數量:"+taskService.createTaskQuery().taskAssignee("李四").count());    for (Task task : tasks) {        System.out.println("李四的任務:name:"+task.getName()+",id:"+task.getId());        taskService.complete(task.getId());    }    System.out.println("李四的任務數量:"+taskService.createTaskQuery().taskAssignee("李四").count());    System.out.println("***************錄用流程結束***************");    HistoryService historyService = processEngine.getHistoryService();    HistoricProcessInstance historicProcessInstance = historyService            .createHistoricProcessInstanceQuery()            .processInstanceId(processId).singleResult();    System.out.println("/n流程結束時間:"+historicProcessInstance.getEndTime());}

代碼清單中使用 ProcessEngines類加載默認的流程配置文件(activiti.cfg.xml),再獲取各個服務組件的實例。RepositoryService主要用于管理流程的資源,RuntimeService主要用于流程運行時的流程管理,TaskService主要用于管理流程任務。最后,HistoricProcessInstance會將工作的流程歷史記錄下來。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 马龙县| 广州市| 皋兰县| 东丰县| 蕉岭县| 泰来县| 金山区| 察隅县| 连江县| 景东| 新民市| 梁河县| 上思县| 饶平县| 普宁市| 广灵县| 九江市| 霞浦县| 富川| 襄城县| 治县。| 辽阳县| 湘潭县| 左贡县| 准格尔旗| 宜宾市| 行唐县| 吴桥县| 中阳县| 杭锦后旗| 磴口县| 黔西县| 五指山市| 临江市| 垦利县| 克拉玛依市| 长沙市| 桂阳县| 开封县| 江山市| 桦南县|