日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

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

编程问答

工作流引擎 Activiti 保姆级教程

發布時間:2023/12/29 编程问答 65 豆豆
生活随笔 收集整理的這篇文章主要介紹了 工作流引擎 Activiti 保姆级教程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

大家好,我是老趙

一、工作流介紹

1.1 概念

工作流(Workflow),就是通過計算機對業務流程自動化執行管理。它主要解決的是“使在多個參與者之間按照某種預定義的規則自動進行傳遞文檔、信息或任務的過程,從而實現某個預期的業務目標,或者促使此目標的實現”。

1.2 工作流系統

一個軟件系統中具有工作流的功能,我們把它稱為工作流系統,一個系統中工作流的功能是什么?就是對系統的業務流程進行自動化管理,所以工作流是建立在業務流程的基礎上,所以一個軟件的系統核心根本上還是系統的業務流程,工作流只是協助進行業務流程管理。即使沒有工作流業務系統也可以開發運行,只不過有了工作流可以更好的管理業務流程,提高系統的可擴展性。

1.3 適用行業

消費品行業,制造業,電信服務業,銀證險等金融服務業,物流服務業,物業服務業,物業管理,大中型進出口貿易公司,政府事業機構,研究院所及教育服務業等,特別是大的跨國企業和集團公司。

1.4 具體應用

1、關鍵業務流程: 訂單、報價處理、合同審核、客戶電話處理、供應鏈管理等

2、行政管理類: 出差申請、加班申請、請假申請、用車申請、各種辦公用品申請、購買申請、日報周報等凡是原來手工流轉處理的行政表單。

3、人事管理類: 員工培訓安排、績效考評、職位變動處理、員工檔案信息管理等。

4、財務相關類: 付款請求、應收款處理、日常報銷處理、出差報銷、預算和計劃申請等。

5、客戶服務類: 客戶信息管理、客戶投訴、請求處理、售后服務管理等。

6、特殊服務類: ISO系列對應流程、質量管理對應流程、產品數據信息管理、貿易公司報關處理、物流公司貨物跟蹤處理等各種通過表單逐步手工流轉完成的任務均可應用工作流軟件自動規范地實施。

1.5 實現方式

在沒有專門的工作流引擎之前,我們之前為了實現流程控制,通常的做法就是采用狀態字段的值來跟蹤流程的變化情況。這樣不同角色的用戶,通過狀態字段的取值來決定記錄是否顯示。

針對有權限可以查看的記錄,當前用戶根據自己的角色來決定審批是否合格的操作。如果合格將狀態字段設置一個值,來代表合格;當然如果不合格也需要設置一個值來代表不合格的情況。

這是一種最為原始的方式。通過狀態字段雖然做到了流程控制,但是當我們的流程發生變更的時候,這種方式所編寫的代碼也要進行調整。

那么有沒有專業的方式來實現工作流的管理呢?并且可以做到業務流程變化之后,我們的程序可以不用改變,如果可以實現這樣的效果,那么我們的業務系統的適應能力就得到了極大提升。

二、Activiti7概述

2.1 介紹

Alfresco軟件在2010年5月17日宣布Activiti業務流程管理(BPM)開源項目的正式啟動,其首席架構師由業務流程管理BPM的專家 Tom Baeyens擔任,Tom Baeyens就是原來jbpm的架構師,而jbpm是一個非常有名的工作流引擎,當然activiti也是一個工作流引擎。

Activiti是一個工作流引擎, activiti可以將業務系統中復雜的業務流程抽取出來,使用專門的建模語言BPMN2.0進行定義,業務流程按照預先定義的流程進行執行,實現了系統的流程由activiti進行管理,減少業務系統由于流程變更進行系統升級改造的工作量,從而提高系統的健壯性,同時也減少了系統開發維護成本。

官方網站:https://www.activiti.org/

經歷的版本:

目前最新版本:Activiti7.0.0.Beta

2.1.1 BPM

BPM(Business Process Management),即業務流程管理,是一種規范化的構造端到端的業務流程,以持續的提高組織業務效率。常見商業管理教育如EMBA、MBA等均將BPM包含在內。

2.1.2 BPM軟件

BPM軟件就是根據企業中業務環境的變化,推進人與人之間、人與系統之間以及系統與系統之間的整合及調整的經營方法與解決方案的IT工具。

通過BPM軟件對企業內部及外部的業務流程的整個生命周期進行建模、自動化、管理監控和優化,使企業成本降低,利潤得以大幅提升。

BPM軟件在企業中應用領域廣泛,凡是有業務流程的地方都可以BPM軟件進行管理,比如企業人事辦公管理、采購流程管理、公文審批流程管理、財務管理等。

2.1.3 BPMN

BPMN(Business Process Model AndNotation)- 業務流程模型和符號 是由BPMI(BusinessProcess Management Initiative)開發的一套標準的業務流程建模符號,使用BPMN提供的符號可以創建業務流程。

2004年5月發布了BPMN1.0規范.BPMI于2005年9月并入OMG(The Object Management Group對象管理組織)組織。OMG于2011年1月發布BPMN2.0的最終版本。

具體發展歷史如下:

BPMN 是目前被各 BPM 廠商廣泛接受的 BPM 標準。Activiti 就是使用 BPMN 2.0 進行流程建模、流程執行管理,它包括很多的建模符號,比如:Event

用一個圓圈表示,它是流程中運行過程中發生的事情。

活動用圓角矩形表示,一個流程由一個活動或多個活動組成

Bpmn圖形其實是通過xml表示業務流程,上邊的.bpmn文件使用文本編輯器打開:

<?xml?version="1.0"?encoding="UTF-8"?> <definitions?xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"?xmlns:xsd="http://www.w3.org/2001/XMLSchema"?xmlns:activiti="http://activiti.org/bpmn"?xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"?xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC"?xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI"?typeLanguage="http://www.w3.org/2001/XMLSchema"?expressionLanguage="http://www.w3.org/1999/XPath"?targetNamespace="http://www.activiti.org/test"><process?id="myProcess"?name="My?process"?isExecutable="true"><startEvent?id="startevent1"?name="Start"></startEvent><userTask?id="usertask1"?name="創建請假單"></userTask><sequenceFlow?id="flow1"?sourceRef="startevent1"?targetRef="usertask1"></sequenceFlow><userTask?id="usertask2"?name="部門經理審核"></userTask><sequenceFlow?id="flow2"?sourceRef="usertask1"?targetRef="usertask2"></sequenceFlow><userTask?id="usertask3"?name="人事復核"></userTask><sequenceFlow?id="flow3"?sourceRef="usertask2"?targetRef="usertask3"></sequenceFlow><endEvent?id="endevent1"?name="End"></endEvent><sequenceFlow?id="flow4"?sourceRef="usertask3"?targetRef="endevent1"></sequenceFlow></process><bpmndi:BPMNDiagram?id="BPMNDiagram_myProcess"><bpmndi:BPMNPlane?bpmnElement="myProcess"?id="BPMNPlane_myProcess"><bpmndi:BPMNShape?bpmnElement="startevent1"?id="BPMNShape_startevent1"><omgdc:Bounds?height="35.0"?width="35.0"?x="130.0"?y="160.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape?bpmnElement="usertask1"?id="BPMNShape_usertask1"><omgdc:Bounds?height="55.0"?width="105.0"?x="210.0"?y="150.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape?bpmnElement="usertask2"?id="BPMNShape_usertask2"><omgdc:Bounds?height="55.0"?width="105.0"?x="360.0"?y="150.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape?bpmnElement="usertask3"?id="BPMNShape_usertask3"><omgdc:Bounds?height="55.0"?width="105.0"?x="510.0"?y="150.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape?bpmnElement="endevent1"?id="BPMNShape_endevent1"><omgdc:Bounds?height="35.0"?width="35.0"?x="660.0"?y="160.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNEdge?bpmnElement="flow1"?id="BPMNEdge_flow1"><omgdi:waypoint?x="165.0"?y="177.0"></omgdi:waypoint><omgdi:waypoint?x="210.0"?y="177.0"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge?bpmnElement="flow2"?id="BPMNEdge_flow2"><omgdi:waypoint?x="315.0"?y="177.0"></omgdi:waypoint><omgdi:waypoint?x="360.0"?y="177.0"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge?bpmnElement="flow3"?id="BPMNEdge_flow3"><omgdi:waypoint?x="465.0"?y="177.0"></omgdi:waypoint><omgdi:waypoint?x="510.0"?y="177.0"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge?bpmnElement="flow4"?id="BPMNEdge_flow4"><omgdi:waypoint?x="615.0"?y="177.0"></omgdi:waypoint><omgdi:waypoint?x="660.0"?y="177.0"></omgdi:waypoint></bpmndi:BPMNEdge></bpmndi:BPMNPlane></bpmndi:BPMNDiagram> </definitions>

2.2 使用步驟

部署activiti

Activiti是一個工作流引擎(其實就是一堆jar包API),業務系統訪問(操作)activiti的接口,就可以方便的操作流程相關數據,這樣就可以把工作流環境與業務系統的環境集成在一起。

流程定義

使用activiti流程建模工具(activity-designer)定義業務流程(.bpmn文件) 。

.bpmn文件就是業務流程定義文件,通過xml定義業務流程。

流程定義部署

activiti部署業務流程定義(.bpmn文件)。

使用activiti提供的api把流程定義內容存儲起來,在Activiti執行過程中可以查詢定義的內容

Activiti執行把流程定義內容存儲在數據庫中

啟動一個流程實例

流程實例也叫:ProcessInstance

啟動一個流程實例表示開始一次業務流程的運行。

在員工請假流程定義部署完成后,如果張三要請假就可以啟動一個流程實例,如果李四要請假也啟動一個流程實例,兩個流程的執行互相不影響。

用戶查詢待辦任務(Task)

因為現在系統的業務流程已經交給activiti管理,通過activiti就可以查詢當前流程執行到哪了,當前用戶需要辦理什么任務了,這些activiti幫我們管理了,而不需要開發人員自己編寫在sql語句查詢。

用戶辦理任務

用戶查詢待辦任務后,就可以辦理某個任務,如果這個任務辦理完成還需要其它用戶辦理,比如采購單創建后由部門經理審核,這個過程也是由activiti幫我們完成了。

流程結束

當任務辦理完成沒有下一個任務結點了,這個流程實例就完成了。

三、Activiti環境

3.1 開發環境

  • Jdk1.8或以上版本

  • Mysql 5及以上的版本

  • Tomcat8.5

  • IDEA

注意:activiti的流程定義工具插件可以安裝在IDEA下,也可以安裝在Eclipse工具下

3.2 Activiti環境

我們使用:Activiti7.0.0.Beta1 默認支持spring5

3.2.1 下載activiti7

Activiti下載地址:http://activiti.org/download.html ,Maven的依賴如下:

<dependencyManagement><dependencies><dependency><groupId>org.activiti</groupId><artifactId>activiti-dependencies</artifactId><version>7.0.0.Beta1</version><scope>import</scope><type>pom</type></dependency></dependencies> </dependencyManagement>
1) Database:

activiti運行需要有數據庫的支持,支持的數據庫有:h2, mysql, oracle, postgres, mssql, db2。

3.2.2 流程設計器IDEA下安裝

在IDEA的File菜單中找到子菜單”Settings”,后面我們再選擇左側的“plugins”菜單,如下圖所示:

此時我們就可以搜索到actiBPM插件,它就是Activiti Designer的IDEA版本,我們點擊Install安裝。

安裝好后,頁面如下:

提示需要重啟idea,點擊重啟。

重啟完成后,再次打開Settings 下的 Plugins(插件列表),點擊右側的Installed(已安裝的插件),在列表中看到actiBPM,就說明已經安裝成功了,如下圖所示:

后面的課程里,我們會使用這個流程設計器進行Activiti的流程設計。

3.3 Activiti的數據庫支持

Activiti 在運行時需要數據庫的支持,使用25張表,把流程定義節點內容讀取到數據庫表中,以供后續使用。

3.3.1 Activiti 支持的數據庫

activiti 支持的數據庫和版本如下:

3.3.2 在MySQL生成表

3.3.2.1 創建數據庫

創建 mysql 數據庫 activiti (名字任意):

CREATE?DATABASE?activiti?DEFAULT?CHARACTER?SET?utf8;

3.3.2.2 使用java代碼生成表

  • 創建 java 工程

使用idea 創建 java 的maven工程,取名:activiti01。

  • 加入 maven 依賴的坐標(jar 包)

首先需要在 java 工程中加入 ProcessEngine 所需要的 jar 包,包括:

  • activiti-engine-7.0.0.beta1.jar

  • activiti 依賴的 jar 包:mybatis、 alf4j、 log4j 等

  • activiti 依賴的 spring 包

  • mysql數據庫驅動

  • 第三方數據連接池 dbcp

  • 單元測試 Junit-4.12.jar

  • 我們使用 maven 來實現項目的構建,所以應當導入這些 jar 所對應的坐標到 pom.xml 文件中。

    完整的依賴內容如下:

    <properties><slf4j.version>1.6.6</slf4j.version><log4j.version>1.2.12</log4j.version><activiti.version>7.0.0.Beta1</activiti.version> </properties> <dependencies><dependency><groupId>org.activiti</groupId><artifactId>activiti-engine</artifactId><version>${activiti.version}</version></dependency><dependency><groupId>org.activiti</groupId><artifactId>activiti-spring</artifactId><version>${activiti.version}</version></dependency><!--?bpmn?模型處理?--><dependency><groupId>org.activiti</groupId><artifactId>activiti-bpmn-model</artifactId><version>${activiti.version}</version></dependency><!--?bpmn?轉換?--><dependency><groupId>org.activiti</groupId><artifactId>activiti-bpmn-converter</artifactId><version>${activiti.version}</version></dependency><!--?bpmn?json數據轉換?--><dependency><groupId>org.activiti</groupId><artifactId>activiti-json-converter</artifactId><version>${activiti.version}</version></dependency><!--?bpmn?布局?--><dependency><groupId>org.activiti</groupId><artifactId>activiti-bpmn-layout</artifactId><version>${activiti.version}</version></dependency><!--?activiti?云支持?--><dependency><groupId>org.activiti.cloud</groupId><artifactId>activiti-cloud-services-api</artifactId><version>${activiti.version}</version></dependency><!--?mysql驅動?--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.40</version></dependency><!--?mybatis?--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.5</version></dependency><!--?鏈接池?--><dependency><groupId>commons-dbcp</groupId><artifactId>commons-dbcp</artifactId><version>1.4</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><!--?log?start?--><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>${log4j.version}</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>${slf4j.version}</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>${slf4j.version}</version></dependency> </dependencies>
    • 添加log4j日志配置

    我們使用log4j日志包,可以對日志進行配置

    在resources 下創建log4j.properties

    #?Set?root?category?priority?to?INFO?and?its?only?appender?to?CONSOLE. #log4j.rootCategory=INFO,?CONSOLE?debug?info?warn?error?fatal log4j.rootCategory=debug,?CONSOLE,?LOGFILE #?Set?the?enterprise?logger?category?to?FATAL?and?its?only?appender?to?CONSOLE. log4j.logger.org.apache.axis.enterprise=FATAL,?CONSOLE #?CONSOLE?is?set?to?be?a?ConsoleAppender?using?a?PatternLayout. log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601}?%-6r[%15.15t]?%-5p?%30.30c?%x?-?%m\n #?LOGFILE?is?set?to?be?a?File?appender?using?a?PatternLayout. log4j.appender.LOGFILE=org.apache.log4j.FileAppender log4j.appender.LOGFILE.File=f:\act\activiti.log log4j.appender.LOGFILE.Append=true log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601}?%-6r[%15.15t]?%-5p?%30.30c?%x?-?%m\n
    • 添加activiti配置文件

    我們使用activiti提供的默認方式來創建mysql的表。

    默認方式的要求是在 resources 下創建 activiti.cfg.xml 文件,注意:默認方式目錄和文件名不能修改,因為activiti的源碼中已經設置,到固定的目錄讀取固定文件名的文件。

    <?xml?version="1.0"?encoding="UTF-8"?> <beans?xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/contex http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> </beans>
    • 在 activiti.cfg.xml 中進行配置

    默認方式要在在activiti.cfg.xml中bean的名字叫processEngineConfiguration,名字不可修改

    在這里有2中配置方式:一種是單獨配置數據源,一種是不單獨配置數據源

    1、直接配置processEngineConfiguration

    processEngineConfiguration 用來創建 ProcessEngine,在創建 ProcessEngine 時會執行數據庫的操作。

    <?xml?version="1.0"?encoding="UTF-8"?> <beans?xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/contex http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"><!--?默認id對應的值?為processEngineConfiguration?--><!--?processEngine?Activiti的流程引擎?--><bean?id="processEngineConfiguration"class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration"><property?name="jdbcDriver"?value="com.mysql.jdbc.Driver"/><property?name="jdbcUrl"?value="jdbc:mysql:///activiti"/><property?name="jdbcUsername"?value="root"/><property?name="jdbcPassword"?value="123456"/><!--?activiti數據庫表處理策略?--><property?name="databaseSchemaUpdate"?value="true"/></bean> </beans>

    2、配置數據源后,在processEngineConfiguration 引用

    首先配置數據源

    <?xml?version="1.0"?encoding="UTF-8"?> <beans?xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/contex http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"><!--?這里可以使用?鏈接池?dbcp--><bean?id="dataSource"?class="org.apache.commons.dbcp.BasicDataSource"><property?name="driverClassName"?value="com.mysql.jdbc.Driver"?/><property?name="url"?value="jdbc:mysql:///activiti"?/><property?name="username"?value="root"?/><property?name="password"?value="123456"?/><property?name="maxActive"?value="3"?/><property?name="maxIdle"?value="1"?/></bean><bean?id="processEngineConfiguration"class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration"><!--?引用數據源?上面已經設置好了--><property?name="dataSource"?ref="dataSource"?/><!--?activiti數據庫表處理策略?--><property?name="databaseSchemaUpdate"?value="true"/></bean> </beans>
    • java類編寫程序生成表

    創建一個測試類,調用activiti的工具類,生成acitivti需要的數據庫表。

    直接使用activiti提供的工具類ProcessEngines,會默認讀取classpath下的activiti.cfg.xml文件,讀取其中的數據庫配置,創建 ProcessEngine,在創建ProcessEngine 時會自動創建表。

    代碼如下:

    package?com.itheima.activiti01.test;import?org.activiti.engine.ProcessEngine; import?org.activiti.engine.ProcessEngineConfiguration; import?org.junit.Test;public?class?TestDemo?{/***?生成?activiti的數據庫表*/@Testpublic?void?testCreateDbTable()?{//使用classpath下的activiti.cfg.xml中的配置創建processEngineProcessEngine?processEngine?=?ProcessEngines.getDefaultProcessEngine();System.out.println(processEngine);} }

    說明:

    • 運行以上程序段即可完成 activiti 表創建,通過改變 activiti.cfg.xml 中databaseSchemaUpdate 參數的值執行不同的數據表處理策略。

    • 上 邊 的 方法 getDefaultProcessEngine方法在執行時,從activiti.cfg.xml 中找固定的名稱 processEngineConfiguration 。

    在測試程序執行過程中,idea的控制臺會輸出日志,說明程序正在創建數據表,類似如下,注意紅線內容:

    執行完成后我們查看數據庫, 創建了 25 張表,結果如下:

    到這,我們就完成activiti運行需要的數據庫和表的創建。

    3.4 表結構介紹

    3.4.1 表的命名規則和作用

    看到剛才創建的表,我們發現Activiti 的表都以 ACT_ 開頭。

    第二部分是表示表的用途的兩個字母標識。用途也和服務的 API 對應。

    • ACT_RE :'RE’表示 repository。這個前綴的表包含了流程定義和流程靜態資源 (圖片,規則,等等)。

    • ACT_RU:'RU’表示 runtime。這些運行時的表,包含流程實例,任務,變量,異步任務,等運行中的數據。Activiti 只在流程實例執行過程中保存這些數據, 在流程結束時就會刪除這些記錄。這樣運行時表可以一直很小速度很快。

    • ACT_HI:'HI’表示 history。這些表包含歷史數據,比如歷史流程實例, 變量,任務等等。

    • ACT_GE :GE 表示 general。通用數據, 用于不同場景下

    3.4.2 Activiti數據表介紹

    四、Activiti類關系圖

    上面我們完成了Activiti數據庫表的生成,java代碼中我們調用Activiti的工具類,下面來了解Activiti的類關系

    4.1 類關系圖

    在新版本中,我們通過實驗可以發現IdentityService,FormService兩個Serivce都已經刪除了。

    所以后面我們對于這兩個Service也不講解了,但老版本中還是有這兩個Service,同學們需要了解一下

    4.2 activiti.cfg.xml

    activiti的引擎配置文件,包括:ProcessEngineConfiguration的定義、數據源定義、事務管理器等,此文件其實就是一個spring配置文件。

    4.3 流程引擎配置類

    流程引擎的配置類(ProcessEngineConfiguration),通過ProcessEngineConfiguration可以創建工作流引擎ProceccEngine,常用的兩種方法如下:

    4.3.1 StandaloneProcessEngineConfiguration

    使用StandaloneProcessEngineConfigurationActiviti可以單獨運行,來創建ProcessEngine,Activiti會自己處理事務。

    配置文件方式:

    通常在activiti.cfg.xml配置文件中定義一個id為 processEngineConfiguration 的bean。

    方法如下:

    <bean?id="processEngineConfiguration"class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration"><!--配置數據庫相關的信息--><!--數據庫驅動--><property?name="jdbcDriver"?value="com.mysql.jdbc.Driver"/><!--數據庫鏈接--><property?name="jdbcUrl"?value="jdbc:mysql:///activiti"/><!--數據庫用戶名--><property?name="jdbcUsername"?value="root"/><!--數據庫密碼--><property?name="jdbcPassword"?value="123456"/><!--actviti數據庫表在生成時的策略??true?-?如果數據庫中已經存在相應的表,那么直接使用,如果不存在,那么會創建--><property?name="databaseSchemaUpdate"?value="true"/></bean>

    還可以加入連接池:

    <?xml?version="1.0"?encoding="UTF-8"?> <beans?xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/contex http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"><bean?id="dataSource"?class="org.apache.commons.dbcp.BasicDataSource"><property?name="driverClassName"?value="com.mysql.jdbc.Driver"/><property?name="url"?value="jdbc:mysql:///activiti"/><property?name="username"?value="root"/><property?name="password"?value="123456"/><property?name="maxActive"?value="3"/><property?name="maxIdle"?value="1"/></bean><!--在默認方式下?bean的id??固定為?processEngineConfiguration--><bean?id="processEngineConfiguration"class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration"><!--引入上面配置好的?鏈接池--><property?name="dataSource"?ref="dataSource"/><!--actviti數據庫表在生成時的策略??true?-?如果數據庫中已經存在相應的表,那么直接使用,如果不存在,那么會創建--><property?name="databaseSchemaUpdate"?value="true"/></bean> </beans>
    4.3.2 SpringProcessEngineConfiguration

    通過org.activiti.spring.SpringProcessEngineConfiguration 與Spring整合。

    創建spring與activiti的整合配置文件:

    activity-spring.cfg.xml(名稱可修改)

    <beans?xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"?xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"?xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans?http://www.springframework.org/schema/beans/spring-beans-3.1.xsd?http://www.springframework.org/schema/mvc?http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd?http://www.springframework.org/schema/context?http://www.springframework.org/schema/context/spring-context-3.1.xsd?http://www.springframework.org/schema/aop?http://www.springframework.org/schema/aop/spring-aop-3.1.xsd?http://www.springframework.org/schema/tx?http://www.springframework.org/schema/tx/spring-tx-3.1.xsd?"><!--?工作流引擎配置bean?--><bean?id="processEngineConfiguration"?class="org.activiti.spring.SpringProcessEngineConfiguration"><!--?數據源?--><property?name="dataSource"?ref="dataSource"?/><!--?使用spring事務管理器?--><property?name="transactionManager"?ref="transactionManager"?/><!--?數據庫策略?--><property?name="databaseSchemaUpdate"?value="drop-create"?/><!--?activiti的定時任務關閉?--><property?name="jobExecutorActivate"?value="false"?/></bean><!--?流程引擎?--><bean?id="processEngine"?class="org.activiti.spring.ProcessEngineFactoryBean"><property?name="processEngineConfiguration"?ref="processEngineConfiguration"?/></bean><!--?資源服務service?--><bean?id="repositoryService"?factory-bean="processEngine"factory-method="getRepositoryService"?/><!--?流程運行service?--><bean?id="runtimeService"?factory-bean="processEngine"factory-method="getRuntimeService"?/><!--?任務管理service?--><bean?id="taskService"?factory-bean="processEngine"factory-method="getTaskService"?/><!--?歷史管理service?--><bean?id="historyService"?factory-bean="processEngine"?factory-method="getHistoryService"?/><!--?用戶管理service?--><bean?id="identityService"?factory-bean="processEngine"?factory-method="getIdentityService"?/><!--?引擎管理service?--><bean?id="managementService"?factory-bean="processEngine"?factory-method="getManagementService"?/><!--?數據源?--><bean?id="dataSource"?class="org.apache.commons.dbcp.BasicDataSource"><property?name="driverClassName"?value="com.mysql.jdbc.Driver"?/><property?name="url"?value="jdbc:mysql://localhost:3306/activiti"?/><property?name="username"?value="root"?/><property?name="password"?value="mysql"?/><property?name="maxActive"?value="3"?/><property?name="maxIdle"?value="1"?/></bean><!--?事務管理器?--><bean?id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property?name="dataSource"?ref="dataSource"?/></bean><!--?通知?--><tx:advice?id="txAdvice"?transaction-manager="transactionManager"><tx:attributes></tx:attributes><!--?傳播行為?--><tx:method?name="save*"?propagation="REQUIRED"?/><tx:method?name="insert*"?propagation="REQUIRED"?/><tx:method?name="delete*"?propagation="REQUIRED"?/><tx:method?name="update*"?propagation="REQUIRED"?/><tx:method?name="find*"?propagation="SUPPORTS"?read-only="true"?/><tx:method?name="get*"?propagation="SUPPORTS"?read-only="true"?/></tx:attributes></tx:advice><!--?切面,根據具體項目修改切點配置?--><aop:config?proxy-target-class="true"><aop:advisor?advice-ref="txAdvice"??pointcut="execution(*?com.itheima.ihrm.service.impl.*.(..))"*?/></aop:config> </beans>

    創建processEngineConfiguration

    ProcessEngineConfiguration?configuration?=?ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml")

    上邊的代碼要求activiti.cfg.xml中必須有一個processEngineConfiguration的bean

    也可以使用下邊的方法,更改bean 的名字:

    ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(String?resource,?String?beanName);

    4.4 工作流引擎創建

    工作流引擎(ProcessEngine),相當于一個門面接口,通過ProcessEngineConfiguration創建processEngine,通過ProcessEngine創建各個service接口。

    4.4.1 默認創建方式

    將activiti.cfg.xml文件名及路徑固定,且activiti.cfg.xml文件中有 processEngineConfiguration的配置, 可以使用如下代碼創建processEngine:

    //直接使用工具類?ProcessEngines,使用classpath下的activiti.cfg.xml中的配置創建processEngine ProcessEngine?processEngine?=?ProcessEngines.getDefaultProcessEngine(); System.out.println(processEngine);
    4.4.2 一般創建方式
    //先構建ProcessEngineConfiguration ProcessEngineConfiguration?configuration?=?ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml"); //通過ProcessEngineConfiguration創建ProcessEngine,此時會創建數據庫 ProcessEngine?processEngine?=?configuration.buildProcessEngine();
    4.5 Servcie服務接口

    Service是工作流引擎提供用于進行工作流部署、執行、管理的服務接口,我們使用這些接口可以就是操作服務對應的數據表

    4.5.1 Service創建方式

    通過ProcessEngine創建Service

    方式如下:

    RuntimeService?runtimeService?=?processEngine.getRuntimeService(); RepositoryService?repositoryService?=?processEngine.getRepositoryService(); TaskService?taskService?=?processEngine.getTaskService();

    4.5.2 Service總覽

    簡單介紹:

    • RepositoryService

    是activiti的資源管理類,提供了管理和控制流程發布包和流程定義的操作。使用工作流建模工具設計的業務流程圖需要使用此service將流程定義文件的內容部署到計算機。

    除了部署流程定義以外還可以:查詢引擎中的發布包和流程定義。

    暫停或激活發布包,對應全部和特定流程定義。暫停意味著它們不能再執行任何操作了,激活是對應的反向操作。獲得多種資源,像是包含在發布包里的文件, 或引擎自動生成的流程圖。

    獲得流程定義的pojo版本, 可以用來通過java解析流程,而不必通過xml。

    • RuntimeService

    Activiti的流程運行管理類。可以從這個服務類中獲取很多關于流程執行相關的信息

    • TaskService

    Activiti的任務管理類。可以從這個類中獲取任務的信息。

    • HistoryService

    Activiti的歷史管理類,可以查詢歷史信息,執行流程時,引擎會保存很多數據(根據配置),比如流程實例啟動時間,任務的參與者, 完成任務的時間,每個流程實例的執行路徑,等等。這個服務主要通過查詢功能來獲得這些數據。

    • ManagementService

    Activiti的引擎管理類,提供了對 Activiti 流程引擎的管理和維護功能,這些功能不在工作流驅動的應用程序中使用,主要用于 Activiti 系統的日常維護。

    五、Activiti入門

    在本章內容中,我們來創建一個Activiti工作流,并啟動這個流程。

    創建Activiti工作流主要包含以下幾步:

    • 定義流程,按照BPMN的規范,使用流程定義工具,用流程符號把整個流程描述出來

    • 部署流程,把畫好的流程定義文件,加載到數據庫中,生成表的數據

    • 啟動流程,使用java代碼來操作數據庫表中的內容

    5.1 流程符號

    BPMN 2.0是業務流程建模符號2.0的縮寫。

    它由Business Process Management Initiative這個非營利協會創建并不斷發展。作為一種標識,BPMN 2.0是使用一些符號來明確業務流程設計流程圖的一整套符號規范,它能增進業務建模時的溝通效率。

    目前BPMN2.0是最新的版本,它用于在BPM上下文中進行布局和可視化的溝通。

    接下來我們先來了解在流程設計中常見的 符號。

    BPMN2.0的基本符合主要包含:

    事件 Event
    活動 Activity

    活動是工作或任務的一個通用術語。一個活動可以是一個任務,還可以是一個當前流程的子處理流程;其次,你還可以為活動指定不同的類型。常見活動如下:

    網關 GateWay

    網關用來處理決策,有幾種常用網關需要了解:

    排他網關 (x)

    ——只有一條路徑會被選擇。流程執行到該網關時,按照輸出流的順序逐個計算,當條件的計算結果為true時,繼續執行當前網關的輸出流;

    • 如果多條線路計算結果都是 true,則會執行第一個值為 true 的線路。如果所有網關計算結果沒有true,則引擎會拋出異常。

    • 排他網關需要和條件順序流結合使用,default 屬性指定默認順序流,當所有的條件不滿足時會執行默認順序流。

    并行網關 (+)

    ——所有路徑會被同時選擇

    • 拆分 —— 并行執行所有輸出順序流,為每一條順序流創建一個并行執行線路。

    • 合并 —— 所有從并行網關拆分并執行完成的線路均在此等候,直到所有的線路都執行完成才繼續向下執行。

    包容網關 (+)

    —— 可以同時執行多條線路,也可以在網關上設置條件

    • 拆分 —— 計算每條線路上的表達式,當表達式計算結果為true時,創建一個并行線路并繼續執行

    • 合并 —— 所有從并行網關拆分并執行完成的線路均在此等候,直到所有的線路都執行完成才繼續向下執行。

    事件網關 (+)

    —— 專門為中間捕獲事件設置的,允許設置多個輸出流指向多個不同的中間捕獲事件。當流程執行到事件網關后,流程處于等待狀態,需要等待拋出事件才能將等待狀態轉換為活動狀態。

    流向 Flow

    流是連接兩個流程節點的連線。常見的流向包含以下幾種:

    5.2 流程設計器使用

    Activiti-Designer使用
    Palette(畫板)

    在idea中安裝插件即可使用,畫板中包括以下結點:

    • Connection—連接

    • Event—事件

    • Task—任務

    • Gateway—網關

    • Container—容器

    • Boundary event—邊界事件

    • Intermediate event- -中間事件

    流程圖設計完畢保存生成.bpmn文件

    新建流程(IDEA工具)

    首先選中存放圖形的目錄(選擇resources下的bpmn目錄),點擊菜單:New -> BpmnFile,如圖:

    彈出如下圖所示框,輸入evection 表示 出差審批流程:

    起完名字evection后(默認擴展名為bpmn),就可以看到流程設計頁面,如圖所示:

    左側區域是繪圖區,右側區域是palette畫板區域

    鼠標先點擊畫板的元素即可在左側繪圖

    繪制流程

    使用滑板來繪制流程,通過從右側把圖標拖拽到左側的畫板,最終效果如下:

    指定流程定義Key

    流程定義key即流程定義的標識,通過properties視圖查看流程的key

    指定任務負責人

    在properties視圖指定每個任務結點的負責人,如:填寫出差申請的負責人為 zhangsan

    • 經理審批負責人為 jerry

    • 總經理審批負責人為 jack

    • 財務審批負責人為 rose

    六、流程操作

    6.1 流程定義

    概述

    流程定義是線下按照bpmn2.0標準去描述 業務流程,通常使用idea中的插件對業務流程進行建模。IDEA插件介紹:IDEA 值得推薦的十幾款優秀插件,狂,拽,屌!

    使用idea下的designer設計器繪制流程,并會生成兩個文件:.bpmn和.png

    .bpmn文件

    使用activiti-desinger設計業務流程,會生成.bpmn文件,上面我們已經創建好了bpmn文件

    BPMN 2.0根節點是definitions節點。這個元素中,可以定義多個流程定義(不過我們建議每個文件只包含一個流程定義, 可以簡化開發過程中的維護難度)。

    注意,definitions元素 最少也要包含xmlns 和 targetNamespace的聲明。targetNamespace可以是任意值,它用來對流程實例進行分類。

    • 流程定義部分:定義了流程每個結點的描述及結點之間的流程流轉。

    • 流程布局定義:定義流程每個結點在流程圖上的位置坐標等信息。

    生成.png圖片文件

    IDEA工具中的操作方式

    1、修改文件后綴為xml

    首先將evection.bpmn文件改名為evection.xml,如下圖:

    evection.xml修改前的bpmn文件,效果如下:

    2、使用designer設計器打開.xml文件

    在evection.xml文件上面,點右鍵并選擇Diagrams菜單,再選擇Show BPMN2.0 Designer…

    3、查看打開的文件

    打開后,卻出現亂碼,如圖:

    4、解決中文亂碼

    1、打開Settings,找到File Encodings,把encoding的選項都選擇UTF-8

    2、打開IDEA安裝路徑,找到如下的安裝目錄

    根據自己所安裝的版本來決定,我使用的是64位的idea,所以在idea64.exe.vmoptions文件的最后一行追加一條命令: -Dfile.encoding=UTF-8

    如下所示:

    一定注意,不要有空格,否則重啟IDEA時會打不開,然后 重啟IDEA。

    如果以上方法已經做完,還出現亂碼,就再修改一個文件,并在文件的末尾添加:-Dfile.encoding=UTF-8,然后重啟idea,如圖:

    最后重新在evection.xml文件上面,點右鍵并選擇Diagrams菜單,再選擇Show BPMN2.0 Designer…,看到生成圖片,如圖:

    到此,解決亂碼問題

    5、導出為圖片文件

    點擊Export To File的小圖標,打開如下窗口,注意填寫文件名及擴展名,選擇好保存圖片的位置:

    然后,我們把png文件拷貝到resources下的bpmn目錄,并且把evection.xml改名為evection.bpmn。

    6.2 流程定義部署

    概述

    將上面在設計器中定義的流程部署到activiti數據庫中,就是流程定義部署。

    通過調用activiti的api將流程定義的bpmn和png兩個文件一個一個添加部署到activiti中,也可以將兩個文件打成zip包進行部署。

    單個文件部署方式

    分別將bpmn文件和png圖片文件部署。

    public?class?ActivitiDemo?{/***?部署流程定義*/@Testpublic?void?testDeployment(){ //????????1、創建ProcessEngineProcessEngine?processEngine?=?ProcessEngines.getDefaultProcessEngine(); //????????2、得到RepositoryService實例RepositoryService?repositoryService?=?processEngine.getRepositoryService(); //????????3、使用RepositoryService進行部署Deployment?deployment?=?repositoryService.createDeployment().addClasspathResource("bpmn/evection.bpmn")?//?添加bpmn資源.addClasspathResource("bpmn/evection.png")??//?添加png資源.name("出差申請流程").deploy(); //????????4、輸出部署信息System.out.println("流程部署id:"?+?deployment.getId());System.out.println("流程部署名稱:"?+?deployment.getName());} }

    執行此操作后activiti會將上邊代碼中指定的bpm文件和圖片文件保存在activiti數據庫。

    壓縮包部署方式

    將evection.bpmn和evection.png壓縮成zip包。

    @Testpublic?void?deployProcessByZip()?{//?定義zip輸入流InputStream?inputStream?=?this.getClass().getClassLoader().getResourceAsStream("bpmn/evection.zip");ZipInputStream?zipInputStream?=?new?ZipInputStream(inputStream);//?獲取repositoryServiceRepositoryService?repositoryService?=?processEngine.getRepositoryService();//?流程部署Deployment?deployment?=?repositoryService.createDeployment().addZipInputStream(zipInputStream).deploy();System.out.println("流程部署id:"?+?deployment.getId());System.out.println("流程部署名稱:"?+?deployment.getName());}

    執行此操作后activiti會將上邊代碼中指定的bpm文件和圖片文件保存在activiti數據庫。

    操作數據表

    流程定義部署后操作activiti的3張表如下:

    • act_re_deployment 流程定義部署表,每部署一次增加一條記錄

    • act_re_procdef 流程定義表,部署每個新的流程定義都會在這張表中增加一條記錄

    • act_ge_bytearray 流程資源表

    接下來我們來看看,寫入了什么數據:

    SELECT?*?FROM?act_re_deployment?#流程定義部署表,記錄流程部署信息

    結果:

    SELECT?*?FROM?act_re_procdef?#流程定義表,記錄流程定義信息

    結果:

    注意,KEY 這個字段是用來唯一識別不同流程的關鍵字

    SELECT?*?FROM?act_ge_bytearray?#資源表

    結果:

    注意:

    act_re_deployment和act_re_procdef一對多關系,一次部署在流程部署表生成一條記錄,但一次部署可以部署多個流程定義,每個流程定義在流程定義表生成一條記錄。每一個流程定義在act_ge_bytearray會存在兩個資源記錄,bpmn和png。

    建議:一次部署一個流程,這樣部署表和流程定義表是一對一有關系,方便讀取流程部署及流程定義信息。

    6.3 啟動流程實例

    流程定義部署在activiti后就可以通過工作流管理業務流程了,也就是說上邊部署的出差申請流程可以使用了。

    針對該流程,啟動一個流程表示發起一個新的出差申請單,這就相當于java類與java對象的關系,類定義好后需要new創建一個對象使用,當然可以new多個對象。對于請出差申請流程,張三發起一個出差申請單需要啟動一個流程實例,出差申請單發起一個出差單也需要啟動一個流程實例。

    代碼如下:

    /***?啟動流程實例*/@Testpublic?void?testStartProcess(){ //????????1、創建ProcessEngineProcessEngine?processEngine?=?ProcessEngines.getDefaultProcessEngine(); //????????2、獲取RunTimeServiceRuntimeService?runtimeService?=?processEngine.getRuntimeService(); //????????3、根據流程定義Id啟動流程ProcessInstance?processInstance?=?runtimeService.startProcessInstanceByKey("myEvection"); //????????輸出內容System.out.println("流程定義id:"?+?processInstance.getProcessDefinitionId());System.out.println("流程實例id:"?+?processInstance.getId());System.out.println("當前活動Id:"?+?processInstance.getActivityId());}

    輸出內容如下:

    操作數據表

    • act_hi_actinst 流程實例執行歷史

    • act_hi_identitylink 流程的參與用戶歷史信息

    • act_hi_procinst 流程實例歷史信息

    • act_hi_taskinst 流程任務歷史信息

    • act_ru_execution 流程執行信息

    • act_ru_identitylink 流程的參與用戶信息

    • act_ru_task 任務信息

    6.4 任務查詢

    流程啟動后,任務的負責人就可以查詢自己當前需要處理的任務,查詢出來的任務都是該用戶的待辦任務。

    /***?查詢當前個人待執行的任務*/@Testpublic?void?testFindPersonalTaskList()?{ //????????任務負責人String?assignee?=?"zhangsan";ProcessEngine?processEngine?=?ProcessEngines.getDefaultProcessEngine(); //????????創建TaskServiceTaskService?taskService?=?processEngine.getTaskService(); //????????根據流程key?和?任務負責人?查詢任務List<Task>?list?=?taskService.createTaskQuery().processDefinitionKey("myEvection")?//流程Key.taskAssignee(assignee)//只查詢該任務負責人的任務.list();for?(Task?task?:?list)?{System.out.println("流程實例id:"?+?task.getProcessInstanceId());System.out.println("任務id:"?+?task.getId());System.out.println("任務負責人:"?+?task.getAssignee());System.out.println("任務名稱:"?+?task.getName());}}

    輸出結果如下:

    流程實例id:2501 任務id:2505 任務負責人:zhangsan 任務名稱:創建出差申請

    6.5 流程任務處理

    任務負責人查詢待辦任務,選擇任務進行處理,完成任務。

    //?完成任務@Testpublic?void?completTask(){ //????????獲取引擎ProcessEngine?processEngine?=?ProcessEngines.getDefaultProcessEngine(); //????????獲取taskServiceTaskService?taskService?=?processEngine.getTaskService();//????????根據流程key?和?任務的負責人?查詢任務 //????????返回一個任務對象Task?task?=?taskService.createTaskQuery().processDefinitionKey("myEvection")?//流程Key.taskAssignee("zhangsan")??//要查詢的負責人.singleResult();//????????完成任務,參數:任務idtaskService.complete(task.getId());}

    6.6 流程定義信息查詢

    查詢流程相關信息,包含流程定義,流程部署,流程定義版本

    /***?查詢流程定義*/@Testpublic?void?queryProcessDefinition(){//????????獲取引擎ProcessEngine?processEngine?=?ProcessEngines.getDefaultProcessEngine(); //????????repositoryServiceRepositoryService?repositoryService?=?processEngine.getRepositoryService(); //????????得到ProcessDefinitionQuery?對象ProcessDefinitionQuery?processDefinitionQuery?=?repositoryService.createProcessDefinitionQuery(); //??????????查詢出當前所有的流程定義 //??????????條件:processDefinitionKey =evection //??????????orderByProcessDefinitionVersion?按照版本排序 //????????desc倒敘 //????????list?返回集合List<ProcessDefinition>?definitionList?=?processDefinitionQuery.processDefinitionKey("myEvection").orderByProcessDefinitionVersion().desc().list(); //??????輸出流程定義信息for?(ProcessDefinition?processDefinition?:?definitionList)?{System.out.println("流程定義?id="+processDefinition.getId());System.out.println("流程定義?name="+processDefinition.getName());System.out.println("流程定義?key="+processDefinition.getKey());System.out.println("流程定義?Version="+processDefinition.getVersion());System.out.println("流程部署ID?="+processDefinition.getDeploymentId());}}

    輸出結果:

    流程定義id:myEvection:1:4 流程定義名稱:出差申請單 流程定義key:myEvection 流程定義版本:1

    6.7 流程刪除

    public?void?deleteDeployment()?{//?流程部署idString?deploymentId?=?"1";ProcessEngine?processEngine?=?ProcessEngines.getDefaultProcessEngine();//?通過流程引擎獲取repositoryServiceRepositoryService?repositoryService?=?processEngine.getRepositoryService();//刪除流程定義,如果該流程定義已有流程實例啟動則刪除時出錯repositoryService.deleteDeployment(deploymentId);//設置true?級聯刪除流程定義,即使該流程有流程實例啟動也可以刪除,設置為false非級別刪除方式,如果流程//repositoryService.deleteDeployment(deploymentId,?true);}

    說明:

    • 使用repositoryService刪除流程定義,歷史表信息不會被刪除

    • 如果該流程定義下沒有正在運行的流程,則可以用普通刪除。

    如果該流程定義下存在已經運行的流程,使用普通刪除報錯,可用級聯刪除方法將流程及相關記錄全部刪除。

    先刪除沒有完成流程節點,最后就可以完全刪除流程定義信息

    項目開發中級聯刪除操作一般只開放給超級管理員使用.

    6.8 流程資源下載

    現在我們的流程資源文件已經上傳到數據庫了,如果其他用戶想要查看這些資源文件,可以從數據庫中把資源文件下載到本地。

    解決方案有:

    • jdbc對blob類型,clob類型數據讀取出來,保存到文件目錄

    • 使用activiti的api來實現

    使用commons-io.jar 解決IO的操作

    引入commons-io依賴包

    <dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version> </dependency>

    通過流程定義對象獲取流程定義資源,獲取bpmn和png

    import?org.apache.commons.io.IOUtils;@Testpublic?void?deleteDeployment(){ //????????獲取引擎ProcessEngine?processEngine?=?ProcessEngines.getDefaultProcessEngine(); //????????獲取repositoryServiceRepositoryService?repositoryService?=?processEngine.getRepositoryService(); //????????根據部署id?刪除部署信息,如果想要級聯刪除,可以添加第二個參數,truerepositoryService.deleteDeployment("1");}public?void??queryBpmnFile()?throws?IOException?{ //????????1、得到引擎ProcessEngine?processEngine?=?ProcessEngines.getDefaultProcessEngine(); //????????2、獲取repositoryServiceRepositoryService?repositoryService?=?processEngine.getRepositoryService(); //??????? 3、得到查詢器:ProcessDefinitionQuery,設置查詢條件,得到想要的流程定義ProcessDefinition?processDefinition?=?repositoryService.createProcessDefinitionQuery().processDefinitionKey("myEvection").singleResult(); //????????4、通過流程定義信息,得到部署IDString?deploymentId?=?processDefinition.getDeploymentId(); //????????5、通過repositoryService的方法,實現讀取圖片信息和bpmn信息 //????????png圖片的流InputStream?pngInput?=?repositoryService.getResourceAsStream(deploymentId,?processDefinition.getDiagramResourceName()); //????????bpmn文件的流InputStream?bpmnInput?=?repositoryService.getResourceAsStream(deploymentId,?processDefinition.getResourceName()); //????????6、構造OutputStream流File?file_png?=?new?File("d:/evectionflow01.png");File?file_bpmn?=?new?File("d:/evectionflow01.bpmn");FileOutputStream?bpmnOut?=?new?FileOutputStream(file_bpmn);FileOutputStream?pngOut?=?new?FileOutputStream(file_png); //????????7、輸入流,輸出流的轉換IOUtils.copy(pngInput,pngOut);IOUtils.copy(bpmnInput,bpmnOut); //????????8、關閉流pngOut.close();bpmnOut.close();pngInput.close();bpmnInput.close();}

    說明:

    • deploymentId為流程部署ID

    • resource_name為act_ge_bytearray表中NAME_列的值

    • 使用repositoryService的getDeploymentResourceNames方法可以獲取指定部署下得所有文件的名稱

    • 使用repositoryService的getResourceAsStream方法傳入部署ID和資源圖片名稱可以獲取部署下指定名稱文件的輸入流

    最后的將輸入流中的圖片資源進行輸出。

    6.9 流程歷史信息的查看

    即使流程定義已經刪除了,流程執行的歷史信息通過前面的分析,依然保存在activiti的act_hi_*相關的表中。所以我們還是可以查詢流程執行的歷史信息,可以通過HistoryService來查看相關的歷史記錄。

    /***?查看歷史信息*/@Testpublic?void?findHistoryInfo(){ //??????獲取引擎ProcessEngine?processEngine?=?ProcessEngines.getDefaultProcessEngine(); //????????獲取HistoryServiceHistoryService?historyService?=?processEngine.getHistoryService(); //????????獲取?actinst表的查詢對象HistoricActivityInstanceQuery?instanceQuery?=?historyService.createHistoricActivityInstanceQuery(); //????????查詢 actinst表,條件:根據 InstanceId 查詢 //????????instanceQuery.processInstanceId("2501"); //????????查詢 actinst表,條件:根據 DefinitionId 查詢instanceQuery.processDefinitionId("myEvection:1:4"); //????????增加排序操作,orderByHistoricActivityInstanceStartTime?根據開始時間排序?asc?升序instanceQuery.orderByHistoricActivityInstanceStartTime().asc(); //????????查詢所有內容List<HistoricActivityInstance>?activityInstanceList?=?instanceQuery.list(); //????????輸出for?(HistoricActivityInstance?hi?:?activityInstanceList)?{System.out.println(hi.getActivityId());System.out.println(hi.getActivityName());System.out.println(hi.getProcessDefinitionId());System.out.println(hi.getProcessInstanceId());System.out.println("<==========================>");}}

    總結

    基本功能介紹以及完成了,如果還需要更加高級的功能比如掛起、激活流程實例、流程變量等請參考

    • https://andyoung.blog.csdn.net/article/details/118345330

    工作流引擎 Activiti 與 Spring boot 結合會是開發跟簡單,不如來看下

    • https://andyoung.blog.csdn.net/article/details/118372175

    來源:https://blog.csdn.net/agonie201218/

    article/details/118198535

    精彩推薦

    1.Elasticsearch 寫入優化記錄,從3000到8000/s 2.全網顯示 IP 歸屬地,是怎么實現的? 3.痛快!SpringBoot終于干掉了循環依賴!TMD爽了! 4.Spring 官宣:換掉 JVM!5.IDEA 的這個功能太贊了!6.微信聊天內容可以被監聽嗎 7.你見過哪些好用到爆的 Java 代碼技巧?8.一款自動生成單元測試的 IDEA 插件 9.你敢信?開發一個管理系統我只用了兩天

    總結

    以上是生活随笔為你收集整理的工作流引擎 Activiti 保姆级教程的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    激情五月激情综合网 | 久久久久久不卡 | 韩国av一区二区三区在线观看 | 欧美性黑人 | 国产精品久久久久久五月尺 | 日韩激情第一页 | 成人黄色电影在线 | 亚洲精品大片www | 97在线观看视频 | 天天干天天做 | 国产精品一区二区久久久 | 成人网大片 | 伊人伊成久久人综合网站 | 国产精品电影一区二区 | 欧美日本不卡视频 | 久久国产免费视频 | 国产精品第一页在线 | 天天视频色 | 欧洲精品久久久久毛片完整版 | 激情欧美在线观看 | 免费在线观看黄 | 亚洲在线视频观看 | 伊人永久 | 日韩欧美在线视频一区二区 | 在线网址你懂得 | 97超级碰碰碰视频在线观看 | 手机在线看永久av片免费 | 99久久精品免费看国产四区 | 69av国产 | 97免费在线观看 | 天天操天天艹 | 中文字幕一区二区三区乱码在线 | 欧美精品久久久久久久久久丰满 | 亚洲天堂网在线视频观看 | 精品在线观 | 国产精品美女久久久久久2018 | 国产区精品区 | 中文字幕a∨在线乱码免费看 | 99这里精品| 亚洲成aⅴ人片久久青草影院 | 男女拍拍免费视频 | 在线看片视频 | 麻豆视频国产 | 91精品国产91久久久久福利 | 久久精品国产免费看久久精品 | 久久成人人人人精品欧 | 91精品欧美 | 欧美一区免费在线观看 | 91精品国产亚洲 | 高清精品久久 | 成人资源在线播放 | 天天射天 | 色婷婷97| 麻豆小视频在线观看 | 国产麻豆传媒 | 亚洲在线视频免费 | 特级黄色电影 | www.狠狠操.com | 精品99免费| www.狠狠操.com | 在线观看av小说 | 中文字幕频道 | 91精品国产成 | 欧美黄污视频 | 伊人天堂久久 | 高清免费在线视频 | 日本在线观看一区 | 亚洲第五色综合网 | 久久综合欧美精品亚洲一区 | 天天操天天干天天玩 | 91九色国产蝌蚪 | 国产女做a爱免费视频 | 狠狠色噜噜狠狠狠狠2021天天 | 久久免费中文视频 | 五月激情丁香图片 | 日韩精品免费专区 | 中文亚洲欧美日韩 | h文在线观看免费 | 亚洲最新在线视频 | 91麻豆网 | 国产不卡网站 | 丁香婷婷综合激情五月色 | 国产精品成人免费精品自在线观看 | 国产欧美精品xxxx另类 | 国产精品久久久精品 | 日韩欧美专区 | 国产香蕉97碰碰碰视频在线观看 | av网在线观看 | 国产成人精品一区二区在线观看 | 日日天天 | 91精品国产自产91精品 | 欧美另类美少妇69xxxx | 久久综合九色综合久99 | 久久久96| 91在线视频导航 | 久久久亚洲精品 | 久久婷婷综合激情 | 国产免费视频一区二区裸体 | 中文字幕亚洲精品在线观看 | 国产福利精品视频 | 狠狠色丁香久久婷婷综合丁香 | 亚洲欧美视频在线播放 | 日韩理论在线播放 | 亚洲欧美视屏 | 五月天天色| 日韩一区在线播放 | 国产专区视频在线观看 | 日韩一区二区三区免费视频 | 亚洲一区二区三区精品在线观看 | 国产精品理论视频 | 91综合视频在线观看 | 国产黄av| 亚洲精品高清一区二区三区四区 | 久久久精品一区二区三区 | 国产91精品一区二区麻豆网站 | 婷婷亚洲五月 | 日韩精品视频久久 | 999国内精品永久免费视频 | 亚洲国产成人久久综合 | av免费网站在线观看 | av中文字幕亚洲 | 国产在线观看一区 | 日本大尺码专区mv | 激情婷婷综合 | 国产精品久久网站 | 欧美在线观看视频一区二区三区 | 日韩高清精品免费观看 | 欧美精品在线一区二区 | 欧美日韩高清在线一区 | 欧美日韩在线精品一区二区 | 日韩精品最新在线观看 | 欧美91精品国产自产 | 二区精品视频 | 久久午夜剧场 | 天堂网一区二区三区 | 国产一级一片免费播放放a 一区二区三区国产欧美 | 一区二区三区久久精品 | av黄色影院 | 婷婷视频在线观看 | 欧美激情亚洲综合 | 500部大龄熟乱视频 欧美日本三级 | 免费a级毛片在线看 | 国产亚洲婷婷免费 | 免费看黄色毛片 | 日韩有码专区 | 伊人午夜视频 | 91视频首页| 91传媒免费观看 | 亚洲一区久久 | 成人免费在线视频观看 | 日韩成年视频 | 久久经典国产视频 | 在线播放亚洲 | 免费av高清 | 久久国产精品色婷婷 | 久草国产视频 | 亚洲激情在线视频 | 欧美性高跟鞋xxxxhd | 曰韩在线 | 福利电影久久 | 婷婷伊人五月 | 五月天婷婷狠狠 | 99精品国产福利在线观看免费 | 久久久www免费电影网 | 在线 欧美 日韩 | 成人一级影视 | 亚洲精品字幕在线观看 | 天天综合网 天天 | 久久精品视频在线观看 | 精品久久久久久久久久岛国gif | a级片网站| 久久精品久久精品久久39 | 亚洲综合激情 | 91精品久久久久 | 在线亚洲激情 | 色视频在线免费观看 | 久久99精品热在线观看 | 国产视频九色蝌蚪 | 午夜色大片在线观看 | 久久综合久久伊人 | 国产玖玖在线 | 国产精品 国产精品 | 精品一区二区久久久久久久网站 | 日韩午夜在线播放 | 草草草影院 | 日韩在线视频精品 | 日日操日日干 | av大片网址 | 天天操狠狠操夜夜操 | 亚洲成色777777在线观看影院 | 日韩xxxbbb | 国产精品6 | 成人h电影在线观看 | 亚洲乱码精品久久久久 | 51精品国自产在线 | 国产精品免费观看久久 | 久草在线免费资源站 | 91久久偷偷做嫩草影院 | 成人av播放 | 国产一级免费在线观看 | 国产亚洲免费的视频看 | 日本久久视频 | 久草在线观看视频免费 | 国产福利在线不卡 | 日韩av电影免费观看 | 91视频亚洲| 国产精品黄网站在线观看 | 片网址| 久久成人18免费网站 | 激情综合网天天干 | 欧美a在线免费观看 | 亚洲一区二区三区在线看 | 午夜色影院 | 99视频在线精品免费观看2 | 黄色大全免费观看 | 亚洲成av人片在线观看www | 蜜臀久久99精品久久久无需会员 | 欧美激情精品久久久久 | 国产一区二区日本 | 高清av不卡 | 亚洲日本成人网 | 日本三级久久久 | 欧美精品免费在线 | 久久久在线观看 | 日韩一区精品 | 米奇四色影视 | 五月天伊人网 | 亚洲视频免费在线观看 | 丁香五月亚洲综合在线 | 久久久综合香蕉尹人综合网 | 午夜国产福利在线 | 亚洲综合国产精品 | 一级α片免费看 | 午夜视频在线观看网站 | 日韩视频免费观看高清完整版在线 | 五月天色综合 | 国产黄色片免费看 | 久久午夜精品 | 99久久精品国产亚洲 | 中国一级片免费看 | 91视频在线免费观看 | 三级av免费 | 欧美日韩亚洲精品在线 | 亚洲电影毛片 | 国产在线视频一区二区三区 | 久久精品免视看 | 日本精品视频在线播放 | 91高清视频在线 | 蜜桃av观看| 成人中文字幕+乱码+中文字幕 | 久久9精品 | 午夜精品一区二区三区在线视频 | 久久这里只有精品首页 | 另类老妇性bbwbbw高清 | 久久精品国产99国产 | 国产黄色片免费观看 | 九九热久久免费视频 | 欧美一区二视频在线免费观看 | 丁香 久久 综合 | 国产精品中文字幕av | 国产在线高清 | 久久精品网站免费观看 | 中文字幕人成不卡一区 | 国产999在线 | 国内精品久久久久久久久 | 97在线视频观看 | 免费美女av | 九九在线视频免费观看 | 日韩成人不卡 | 人人揉人人揉人人揉人人揉97 | 国产亚洲视频系列 | 伊人狠狠操 | 欧美一区二区在线 | 亚洲视频专区在线 | 亚洲午夜精品一区二区三区电影院 | 免费午夜在线视频 | 国产专区精品 | 在线观看的av | 中文在线字幕免 | 日韩成人精品在线观看 | 国内精品福利视频 | 黄色www| 亚洲每日更新 | 国产99一区视频免费 | 久草久草视频 | 在线一二三四区 | 最新午夜| 日日操日日操 | 少妇bbb好爽 | 91精品国产麻豆国产自产影视 | 草久久av | 天天干夜夜干 | 欧美视频日韩 | 亚洲免费精彩视频 | 又黄又爽免费视频 | 成人午夜电影在线播放 | 久久久精华网 | 亚洲成人影音 | 最近中文字幕mv | 91在线视频网址 | 国产精品久久久久影院 | 亚洲视频1区2区 | 成人动漫一区二区三区 | 国产一区欧美二区 | av网站手机在线观看 | 精品国产一区二区三区久久久蜜月 | 日韩欧美国产免费播放 | 二区三区在线观看 | 九九九九精品九九九九 | 久久人人精 | 日本成人中文字幕在线观看 | 狠狠操狠狠干天天操 | 日精品 | 久久精品久久精品久久 | 在线色亚洲 | 99精品欧美一区二区三区黑人哦 | 91精品影视 | 91成人精品一区在线播放69 | 在线精品视频免费播放 | 亚洲国产无 | 久久久久亚洲精品 | 在线视频国产区 | 在线观看av网 | 91爱爱电影| 久久久久久久久久网 | 日本黄色大片儿 | 日韩欧美精品在线 | 91黄色免费看 | 热久久免费视频精品 | 97av视频| 色www精品视频在线观看 | 在线观看免费一级片 | 成人欧美一区二区三区黑人麻豆 | 一级α片 | av国产在线观看 | 超级碰碰免费视频 | 日韩理论片在线观看 | 美女视频久久黄 | 激情在线免费视频 | 色香天天| 中文字幕中文字幕 | 操综合 | 国产精品女人网站 | 不卡视频在线 | 正在播放亚洲精品 | 欧美激情综合色综合啪啪五月 | 国产成人久 | 国产中文字幕网 | 精品高清美女精品国产区 | 欧美不卡在线 | 国产爽妇网 | 一区二区三区免费网站 | 欧美激情另类文学 | 国产一区二区三区久久久 | 国产精品99久久久精品 | 欧美日韩一二三四区 | 亚洲精品乱码白浆高清久久久久久 | 色婷婷激情电影 | 久久精品播放 | 亚洲免费精品一区二区 | 探花国产在线 | 激情久久久久 | 伊人婷婷久久 | 国产精品视频你懂的 | 久久久久欧美精品 | 欧美精品在线免费 | 国产亚洲视频系列 | 中文国产字幕 | 亚洲激情av| 国产不卡av在线播放 | 美女久久久久久久 | 视频在线观看99 | 欧美日韩在线播放一区 | 久久韩国免费视频 | 国产黄色免费 | 天天操天天透 | 天天爱天天操天天爽 | 久久免费一 | 久草视频在线播放 | av高清不卡 | 亚洲最新在线视频 | 日韩网站一区二区 | 亚洲mv大片欧洲mv大片免费 | 在线久草视频 | 在线视频你懂 | 亚洲午夜精 | 精品无人国产偷自产在线 | 欧美大片第1页 | 狠狠色丁婷婷日日 | 国产91影院 | 九九热视频在线免费观看 | 国产日韩欧美在线免费观看 | 三级黄色欧美 | 肉色欧美久久久久久久免费看 | 日韩高清精品免费观看 | 亚洲一区二区三区miaa149 | 色五月成人 | 日韩视频在线观看视频 | 国产四虎影院 | 国产拍揄自揄精品视频麻豆 | 香蕉影视app | 婷婷色六月天 | 丁香激情综合 | 美女精品国产 | 日日干视频 | 91秒拍国产福利一区 | 日韩理论 | 国产精品6 | 99精品视频观看 | 久久久国产精品亚洲一区 | 免费观看一级视频 | 欧美久久久久久久久 | 一区二区三区免费 | 色午夜影院 | www.狠狠操.com | 久久亚洲成人网 | 国产精品18videosex性欧美 | 中文字幕色综合网 | 日韩精品视频免费在线观看 | 丁香五月亚洲综合在线 | 97超碰人人澡 | 日韩高清精品免费观看 | 欧美另类高潮 | 国产精品成人久久久久久久 | 欧美国产不卡 | 激情视频免费观看 | 99精品成人| 日韩中文幕 | 97在线视频免费播放 | www.日本色 | 亚洲作爱 | 亚洲成人高清在线 | 国产手机视频在线 | 操操日日 | 精品视频专区 | 中文字幕在线观看免费高清完整版 | 九九九电影免费看 | 婷婷六月丁香激情 | 麻花豆传媒mv在线观看 | 免费三级网 | 国产在线一区二区 | 在线精品观看 | 国产高清av在线播放 | 国产精品乱看 | 欧洲激情在线 | 精品国产乱码久久久久久浪潮 | 91大神电影| 国产理论在线 | 国产午夜亚洲精品 | 中文亚洲欧美日韩 | 射久久久 | 视频福利在线观看 | 日韩1页| 免费在线看v | 欧美久久久久久久久久久久久 | 2024国产在线 | 99精品欧美一区二区三区 | 成人四虎 | 美女免费av| 99久久精品午夜一区二区小说 | 欧美激情视频在线观看免费 | 99热这里只有精品在线观看 | 国产精品久久久毛片 | 操操操av| 国产人在线成免费视频 | 国产网站在线免费观看 | 国产精品不卡视频 | 久草热视频 | 97视频在线观看免费 | 狠狠操欧美 | 国产小视频精品 | 日韩在线高清免费视频 | 久久影视一区二区 | 一区二区三区四区五区六区 | 蜜臀一区二区三区精品免费视频 | 最近中文字幕在线中文高清版 | 中文字幕一区二区三区四区视频 | 在线观看国产日韩 | 国产精品美女久久久久久久久久久 | 国内精品久久久久久久影视简单 | 狠狠躁夜夜躁人人爽视频 | 九九综合久久 | 91精品成人 | 五月花婷婷 | 人人dvd | 免费在线观看视频一区 | 精品国产伦一区二区三区 | 婷婷国产v亚洲v欧美久久 | 婷婷伊人综合亚洲综合网 | 亚洲一区二区三区精品在线观看 | 欧美激情综合五月 | 亚洲最大色 | 国内精品久久久久久 | 国产精品久久久电影 | 亚洲精品中文在线 | 美女免费视频观看网站 | 亚洲精品字幕在线观看 | 天天激情天天干 | 亚洲高清久久久 | 一区二区精品久久 | 国产福利电影网址 | 五月婷婷天堂 | 五月天激情在线 | 亚洲综合成人婷婷小说 | 色综合久久精品 | 麻豆国产精品视频 | 国产精品免费在线播放 | 在线欧美日韩 | 国产字幕在线播放 | 亚洲伊人网在线观看 | 婷婷综合av | 天天操天天操天天 | 国产精品手机播放 | 国产成人久久av977小说 | 成年人视频在线免费 | 亚洲精品黄色 | 欧美 日韩精品 | 久久黄网站 | 久久艹欧美 | 91一区二区三区久久久久国产乱 | 九九九九九九精品 | 色狠狠婷婷 | 日韩电影一区二区在线观看 | 超级碰碰碰碰 | 丁香六月婷婷开心 | 999久久久久 | 久久好看免费视频 | 色窝资源 | а天堂中文最新一区二区三区 | 久久久精品网站 | 久久婷婷色综合 | 国产小视频免费在线网址 | 久久精品视频中文字幕 | 69精品久久久 | 97香蕉久久超级碰碰高清版 | 在线观看中文字幕第一页 | 久久在现| 九九热精品国产 | 丝袜制服天堂 | 久久成人毛片 | 日韩国产欧美在线播放 | 婷婷深爱| 鲁一鲁影院 | 全久久久久久久久久久电影 | 中文字幕乱在线伦视频中文字幕乱码在线 | 九九热免费精品视频 | 国产日韩欧美综合在线 | 人人涩| 欧美性生活免费看 | 国产中文视频 | 欧美精品久久人人躁人人爽 | 91天天操 | 毛片网站免费在线观看 | 国产香蕉97碰碰碰视频在线观看 | 国内精品久久久久久久久 | 激情导航 | 久久免费精品视频 | 日韩欧美视频免费在线观看 | 天天躁日日躁狠狠躁av中文 | 久久国产露脸精品国产 | 日韩二区在线 | 久久伊人精品一区二区三区 | 黄色三级免费观看 | 色永久免费视频 | 久久网址 | 久久草网站 | 一区二区三区免费在线观看 | 国产精品理论片在线观看 | 日日夜夜中文字幕 | 成人在线网站观看 | 精品国偷自产国产一区 | 欧美日韩精品在线一区二区 | 美女黄久久 | 天天射网 | 亚洲欧洲国产视频 | 精品日韩在线 | 天天激情天天干 | 国产在线精品视频 | av动态图片| 三级黄色大片在线观看 | 麻豆综合网 | www免费视频com| 日本精品小视频 | 国产精品破处视频 | 国产精品欧美日韩 | 色综合亚洲精品激情狠狠 | 成人av网站在线播放 | 久久在线视频精品 | 色多多在线观看 | 日韩专区在线观看 | 一级黄色在线视频 | 亚洲欧洲精品一区 | 色综合天天色综合 | 国产成人精品久久久久 | 美女福利视频一区二区 | 久久久久国产精品厨房 | a在线观看免费视频 | 天天看天天操 | 成人免费视频网站在线观看 | 日韩一二三在线 | 欧美成人亚洲成人 | 日本一区二区免费在线观看 | 99精品久久精品一区二区 | 人人玩人人添人人澡超碰 | 黄网站色成年免费观看 | 在线你懂 | 成人黄色视 | 日韩免费在线观看网站 | 97超碰在线资源 | 在线 影视 一区 | 日本中文一区二区 | 久久精品欧美一区二区三区麻豆 | 91丨九色丨丝袜 | 日韩伦理片hd | 99精品国产高清在线观看 | 亚洲成熟女人毛片在线 | 黄免费在线观看 | 欧美韩日精品 | 91成人免费在线视频 | 午夜在线免费观看视频 | 久久久久北条麻妃免费看 | 国产91精品一区二区绿帽 | 日韩com | 97国产电影 | 最近中文字幕大全 | 精品自拍网| 丁香婷婷在线观看 | 国产欧美日韩一区 | 91精品人成在线观看 | 女人高潮特级毛片 | 色网免费观看 | 天天色天天爱天天射综合 | 久久精品99精品国产香蕉 | 中文字幕免费久久 | 久久午夜电影 | 久久成人18免费网站 | 国产粉嫩在线观看 | 九九日韩 | 国产黄在线观看 | 日韩午夜网站 | 久久国产精品99国产 | 欧美在线视频不卡 | 最新中文字幕视频 | 亚洲国产精品资源 | 黄色一级大片在线免费看产 | 国产高清黄 | 日韩精品一区二区三区外面 | 92国产精品久久久久首页 | 天天干天天操av | 国产精品v欧美精品 | 伊人视频 | 五月婷婷综合在线观看 | 在线观看视频亚洲 | 992tv成人免费看片 | 视频在线精品 | 亚洲一二三在线 | 在线欧美中文字幕 | 亚洲精品456在线播放第一页 | 99色资源 | 色综合天天视频在线观看 | 成人免费视频播放 | av九九九 | 四虎亚洲精品 | 久久好看 | 一级黄色在线免费观看 | 草久草久 | 天天看天天干天天操 | 亚洲天堂网在线视频观看 | 免费精品在线观看 | 日韩免费高清在线 | 一区二区欧美在线观看 | 日本护士撒尿xxxx18 | 日本xxxxav| 国产伦理久久 | 免费观看黄| 亚洲毛片视频 | 青青河边草观看完整版高清 | 日本三级全黄少妇三2023 | 网站免费黄 | 91禁在线看 | 欧美日韩精品在线观看 | 精品久久毛片 | 丝袜美女视频网站 | a视频免费 | 狠狠干中文字幕 | 黄av资源| 99在线观看免费视频精品观看 | 激情深爱五月 | 福利一区二区在线 | 热精品 | 久久久免费网站 | www.五月婷婷| 亚洲国产精品资源 | 免费三级影片 | 成av在线| 久久不卡av | 欧美日韩一区三区 | 日本一区二区三区免费观看 | 日韩在线视频国产 | 久久久精华网 | 欧美一级乱黄 | 免费中文字幕在线观看 | 开心色停停 | 在线视频一区二区 | 狠狠干网址 | 91大片成人网 | 天天操操操操操操 | 国产va在线观看免费 | av在线免费在线观看 | 国产精品18毛片一区二区 | 亚洲视频分类 | 日韩一区二区三区在线看 | www.黄色片网站 | 久久久久久国产精品999 | 亚洲精选在线 | 一区二区伦理 | 在线观看黄色的网站 | 日韩成人在线免费观看 | 欧美a免费| 久久久久免费 | 99精品国产一区二区 | 亚洲精品在线观看中文字幕 | 久久韩国免费视频 | 国产在线精品一区二区 | 国产精品av久久久久久无 | 日韩精品91偷拍在线观看 | 国产精品成人久久久 | 欧美日韩精品免费观看视频 | 水蜜桃亚洲一二三四在线 | 亚洲在线网址 | 欧美精品午夜 | 久久久久女教师免费一区 | 日日碰狠狠躁久久躁综合网 | 免费午夜视频在线观看 | 欧洲精品一区二区 | 日韩专区在线播放 | 欧美日韩国产精品一区二区亚洲 | 色综合久久悠悠 | 日产乱码一二三区别免费 | 国产亚洲综合在线 | 99中文字幕在线观看 | 欧美另类重口 | 欧美一区二区伦理片 | 99在线精品视频在线观看 | 色综合久久久久综合体 | 日韩中文字幕91 | 激情开心| 五月婷婷开心中文字幕 | 天堂网一区| 一区二区三区四区精品视频 | 国产夫妻av在线 | 少妇bbw撒尿 | 久久中文字幕导航 | 精品久久久久久久久久久久久 | 国产精品久久99综合免费观看尤物 | 98久9在线 | 免费 | 91男人影院| 三级免费黄 | 婷婷色5月 | 岛国av在线 | 日韩xxxbbb | 色婷婷六月天 | 午夜精品久久久久久久99水蜜桃 | 在线观看av网站 | 在线精品视频在线观看高清 | 西西www4444大胆在线 | 狠狠干天天射 | 精品婷婷 | 中日韩免费视频 | 国产视频日韩视频欧美视频 | 久久久久蜜桃 | 99精品久久99久久久久 | 亚洲精品一区二区久 | 在线观看亚洲专区 | 9i看片成人免费看片 | 国产麻豆精品一区 | 日韩免费网址 | 久久精品99久久久久久2456 | 精品国产中文字幕 | 91视频91色 | 99在线热播精品免费 | 国产精品免费av | 中文字幕影片免费在线观看 | 中文字幕在线电影 | 中文字幕日本在线观看 | 成 人 黄 色 片 在线播放 | 中文字幕第一页在线视频 | 天天干夜夜爽 | 国产第页| 在线电影a | 91亚洲精品国偷拍 | 91色偷偷| 国产亚洲久一区二区 | 人人干天天干 | 少妇资源站 | 久久激情日本aⅴ | 中文字幕av专区 | 在线小视频你懂得 | 国产日本亚洲高清 | 婷婷狠狠操 | 国产精品你懂的在线观看 | 国产一区二区精品 | 免费在线观看黄色网 | 精品自拍sae8—视频 | 狠狠干美女 | 在线观看免费av网站 | 久精品视频 | 最近日本中文字幕 | 亚洲高清av | 在线免费视 | 欧美精品久久 | 国产高清不卡在线 | 亚洲.www| 欧美三人交| 欧美激情视频在线观看免费 | 99久久婷婷国产综合亚洲 | 国产在线观看黄 | www.91av在线 | 西西444www大胆无视频 | 久久精精品视频 | 国产99久久99热这里精品5 | www.久久久久 | 中文字幕在线播放第一页 | 久久久av电影 | 日韩中文字幕网站 | 毛片基地黄久久久久久天堂 | 欧美在线一 | 久久三级毛片 | 精品伊人久久久 | 揉bbb玩bbb少妇bbb | 午夜色大片在线观看 | 国产一区二区免费在线观看 | 麻豆视频免费播放 | 天天舔夜夜操 | 精品成人久久 | 久草在线一免费新视频 | 伊人av综合| 国产精品永久免费 | 手机看片福利 | 国产精品初高中精品久久 | 日p视频| 手机看片中文字幕 | 久久精品中文字幕一区二区三区 | 97看片 | www久久精品| 欧美性护士| 九色激情网 | 国产午夜精品一区二区三区 | 久久久久女人精品毛片 | 久久最新 | 色永久免费视频 | 免费看亚洲毛片 | 在线观看一区 | 国产手机在线 | 黄色官网在线观看 | av电影在线免费观看 | 日日爽视频 | 91大神dom调教在线观看 | 欧美性极品xxxx做受 | 亚洲午夜精品久久久久久久久久久久 | 亚洲精品国产拍在线 | 五月婷久 | 99精品热视频只有精品10 | 97人人超| 婷婷丁香综合 | 国产精品一区二区中文字幕 | 国产区网址 | 美女免费av| 国产精品久久久久久妇 | 久久精品国产亚洲精品 | 久久视频一区二区 | 日韩精选在线 | 成人午夜电影在线播放 | caobi视频| 人人爽人人爽人人爽人人爽 | 91影视成人 | 国产精品高清免费在线观看 | 久久福利 | zzijzzij亚洲日本少妇熟睡 | av天天澡天天爽天天av | 就色干综合 | 日韩欧美综合在线视频 | 亚洲欧美日韩不卡 | 欧美91精品久久久久国产性生爱 | 91经典在线 | 久久久亚洲精华液 | 国产视频在线一区二区 | 7777精品伊人久久久大香线蕉 | 国产系列精品av | 在线观看视频亚洲 | av成人免费在线 | 97超碰资源| 免费看精品久久片 | 国产精品99久久久久久有的能看 | 操少妇视频 | 国产一级黄 | 精品久久久久久国产偷窥 | 久草在线免费在线观看 | 亚洲视频免费在线观看 | 免费亚洲视频 | 91在线视频导航 | 欧美一级在线看 | 久久久久久久久久久高潮一区二区 | 91九色在线视频观看 | 91看片淫黄大片在线播放 | 91av大全| 黄色a一级视频 | 久久情网 | 欧美 日韩 国产 成人 在线 | 亚洲女同ⅹxx女同tv | 色网站在线 | 97色婷婷成人综合在线观看 | 最新中文字幕在线观看视频 | 免费色婷婷 | www久久| 日本丶国产丶欧美色综合 | 麻花传媒mv免费观看 | 成年人免费电影 | 日本中文在线播放 | 久久国产精品免费观看 | www.色综合.com | 国产精品欧美在线 | 日韩久久久久久久 | 中文字幕视频三区 | 天堂av网在线| 亚洲精品日韩在线观看 | 久久成人精品 | 右手影院亚洲欧美 | 一区二区国产精品 | 国产第一页福利影院 | 国产欧美日韩视频 | 一级c片| 麻豆传媒视频在线免费观看 | 黄色99视频 | 日韩精品一区二区三区免费观看 | 亚洲老妇xxxxxx | 四虎欧美 | 国产精品系列在线观看 | 国产黄色在线观看 | 91日韩精品一区 | 视频一区视频二区在线观看 | 伊人天天综合 | www日韩在线观看 | 不卡的av在线播放 | 日韩视频中文 | 成人一级影视 | 欧美久草网 | 国产午夜激情视频 | 成人黄色在线播放 | 日韩欧三级 | 国产一区二区三精品久久久无广告 | 日韩精品久久久久久久电影竹菊 | 久久国产精品二国产精品中国洋人 | 国产在线观看a | 欧美一级久久久久 | 亚洲婷婷在线 | 欧美成天堂网地址 | 国产一线二线三线性视频 | 欧美成人高清 | 成人免费视频在线观看 | 久久婷婷开心 | 在线视频电影 | 国产白浆视频 | 国产精品一区在线观看你懂的 | 看片的网址 | 91精品在线免费观看视频 | 国产精品久久久久久爽爽爽 | 亚洲狠狠婷婷 | 91精品啪啪 | 激情六月婷婷久久 | 国产精品少妇 | 国产精品人人做人人爽人人添 | 久久伦理电影网 | 久久久免费电影 | 粉嫩av一区二区三区四区在线观看 | 超碰人人91| 高清免费av在线 | 国产不卡在线观看视频 | 狠狠色噜噜狠狠 | 久久免费大片 | 亚洲视频999 | 成人在线超碰 | 国产 av 日韩| 亚洲2019精品 | 国产蜜臀av | 天天人人 | 一本一道久久a久久综合蜜桃 | 精品免费国产一区二区三区四区 | 国产成人久久久久 | 久久精品9 | 字幕网在线观看 | 久久久www成人免费毛片 | 久久久www成人免费精品张筱雨 | 女人18精品一区二区三区 | 激情导航 | 九九热免费视频在线观看 | 97免费中文视频在线观看 | 日日麻批40分钟视频免费观看 |