亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

工作流學習——Activiti整體認識二步曲

2019-11-08 00:25:11
字體:
來源:轉載
供稿:網友

一、前言

 

    在上一篇文章中我們將工作流的相關概念、activiti的前世今生、activiti與jbpm的比較進行學習,這篇文章我們正式進行activiti的學習,activiti的整個學習我們主要通過例子的形式來理解。今天我們主要是準備下activiti的環境,在數據庫中創建activiti默認的23張表以及activiti核心對象PRocessEngine最后是一個activiti的簡單demo。

 

 

二、環境準備

 

    相關軟件及版本:

 

    jdk版本:Jdk1.8

    IDE:eclipse

    數據庫:MySQL

    Activiti:5.13

 

    eclipse中安裝流程設計器插件:

 

    eclipse打開help->install new software,單擊add: 

    Name: Activiti BPMN2.0 designer 

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

進行安裝即可。

 

    引入jar包:

 

    ${Activiti_HOME}/install/activiti-5.13/libs(activiti相關包)+mysql對應驅動包(mysql-connector-java.jar)

 

    jar包引入完畢后,我們環境就準備的差不多了,往下我們就該創建我們activiti數據庫默認的表了。

 

三、創建activiti

 

    在activiti中,相對于前身jbpm基礎上又額外多了5張表,所有現在的activiti框架默認提供了23張表。所以第一步我們就來創建這23張表。

 

方法1:使用代碼來創建activiti工作流的表

 

[java] view plain copy方法1:使用代碼來創建activiti工作流的表    // 使用代碼創建工作流需要的23張表  @Test  public void createTable() {      // 工作流引擎的全部配置      ProcessEngineConfiguration processEngineConfiguration = ProcessEngineConfiguration              .createStandaloneProcessEngineConfiguration();        // 鏈接數據的配置      processEngineConfiguration.setJdbcDriver("com.mysql.jdbc.Driver");      processEngineConfiguration              .setJdbcUrl("jdbc:mysql://localhost:3306/activiti1?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf8");      processEngineConfiguration.setJdbcUsername("root");      processEngineConfiguration.setJdbcPassWord("123456");         /*      * public static final String DB_SCHEMA_UPDATE_FALSE = "false";      * 不能自動創建表,需要表存在 public static final String DB_SCHEMA_UPDATE_CREATE_DROP      * = "create-drop"; 先刪除表再創建表 public static final String      * DB_SCHEMA_UPDATE_TRUE = "true";如果表不存在,自動創建表      */      //如果表不存在,自動創建表      processEngineConfiguration              .setDatabaseSchemaUpdate(processEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);      // 工作流的核心對象,ProcessEnginee對象      ProcessEngine processEngine = processEngineConfiguration              .buildProcessEngine();      System.out.println(processEngine);      }      代碼執行完畢,我們通過navicat查看數據庫會發現,創建了一個新的數據庫activiti1,并且還有23張表。

 

 

方式2:使用配置文件來創建activiti的表

 

    在類路徑下創建Activiti.cfg.xml文件,文件內容為:

[java] view plain copy<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-2.5.xsd  http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">          <bean id="processEngineConfiguration"          class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">          <!-- 連接數據的配置 -->          <property name="jdbcDriver" value="com.mysql.jdbc.Driver"></property>          <property name="jdbcUrl"              value="jdbc:mysql://localhost:3306/activiti1?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf8"></property>          <property name="jdbcUsername" value="root"></property>          <property name="jdbcPassword" value="123456"></property>          <!-- 沒有表創建表 -->          <property name="databaseSchemaUpdate" value="true"></property>      </bean>    </beans>  

    通過代碼來加載配置文件中內容:

[java] view plain copy/**  * 使用配置文件來創建數據庫中的表  */  @Test  public void createTable_2() {      //通過讓工作流引擎的全部配置對象來執行配置文件中的內容來創建流程引擎對象      ProcessEngine processEngine = ProcessEngineConfiguration              .createProcessEngineConfigurationFromResource(                      "activiti.cfg.xml").buildProcessEngine();      System.out.println("processEngine" + processEngine);  }  運行產生的結果與第一種是一樣的,其中這一種通過配置文件的方式是用的是比第一種多的。

 

 

連接數據庫url寫法:

 

    無論是通過代碼還是通過xml文件來創建工作流的表,里面都涉及到一個知識點就是mysql的url的寫法,我們進行下小結:

 

    #autoReconnect當數據庫連接丟失時是否自動連接,取值true/false 缺省為false

    #maxReconnects如果autoReconnect為true,此參數為重試次數,缺省為3次 

    #initialTimeout如果autoReconnect為true,此參數為重新連接前等待的秒數缺省為2

    #maxRows設置查詢時返回的行數,0表示全部缺省為0

    #useUnicode是否使用unicode輸出,true/false缺省為false

    #characterEncoding如果useUnicode,該參數制定encoding類型,建議使用utf8缺省為無

    #createDatabaseIfNotExist當JDBC連接指定數據庫,如果此數據庫不存在,此參數值為true時,則自動創建此數據庫

 

    下面是一個url的例子:

[java] view plain copyjdbc:mysql://localhost:3306/ourmysql?  createDatabaseIfNotExist=true&  amp;useUnicode=true&  amp;characterEncoding=utf8&  amp;autoReconnect=true&  amp;useLocalsessionState=true  

四、核心對象ProcessEngine

 

    數據庫里的表創建完畢,接下來我們講述activiti里面的核心對象ProcessEngine。

 

    ProcessEngine類,一般稱為流程引擎類,沒錯,這個流程引擎就是我們上一篇文章中提到的流程引擎,它是activiti中最核心的類,并且這個類是線程安全的,所有的線程和請求都可以使用同一個ProcessEngine對象,其它常用類幾乎也都是由它而來的。

 

得到ProcessEngine對象:

 

    方式1:使用classpath根目錄下的默認配置文件jbpm.cfg.xml創建一個單例的ProcessEngine

 

[java] view plain copyProcessEngineprocessEngine = ProcessEngines.getDefaultProcessEngine();      方式2:指定其他位置:配置文件,如src根目錄config包下的my-jbpm-cfg.xml。

 

[java] view plain copyProcessEngineprocessEngine = ProcessEngineConfiguration  .createProcessEngineConfigurationFromResource(  "config/my-jbpm-cfg.xml").buildProcessEngine();  

得到各個Service

 

    RepositoryService

 

    RepositoryService是管理流程定義的倉庫服務的接口。

 

[java] view plain copyRepositoryServicerepositoryService = processEngine.getRepositoryService();      RuntimeService

 

    RuntimeService是activiti的流程執行服務類??梢詮倪@個服務類中獲取很多關于流程執行相關的信息,如執行管理,包括啟動、推進、刪除流程實例等操作。

 

[java] view plain copyRuntimeServiceruntimeService = processEngine.getRuntimeService();      TaskService

 

    TaskService是activiti的任務服務類??梢詮倪@個類中獲取任務的信息。

 

[java] view plain copyTaskServicetaskservice = processEngine.getTaskService();      HistoryService

 

    HistoryService 是activiti的查詢歷史信息的類。在一個流程執行完成后,這個對象為我們提供查詢歷史信息。

 

[java] view plain copyHistoryServicehistoryService = processEngine.getHistoryService();      到這里關于activiti核心對象ProcessEngine先介紹這么多,下面看我們的小的helloworld的demo。

五、Demo流程

 

第一步流程設計畫出業務流程

 

我們通過流程設計器就可以拖拖拽拽出我們的流程,同時設置相關屬性,保存后會生成兩個文件,分別是helloworld.bpmn和helloworld.png.

 

這是我們的流程圖:

 

 

第二步部署流程定義

 

[java] view plain copy/**  * 部署流程定義  */  @Test  public void deploymentProcessDefinition() {      //創建核心引擎對象      ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();      Deployment deployment = processEngine.getRepositoryService()// 與流程定義和部署對象相關的service              .createDeployment()// 創建一個部署對象              .name("helloworld入門程序")// 添加部署的名稱              .addClasspathResource("diagrams/helloworld.bpmn")// classpath的資源中加載,一次只能加載                                                                  // 一個文件              .addClasspathResource("diagrams/helloworld.png")// classpath的資源中加載,一次只能加載                                                              // 一個文件              .deploy();// 完成部署      System.out.println("部署ID:" + deployment.getId());      System.out.println("部署名稱:" + deployment.getName());  }  運行結果:

    部署ID:1

    部署名稱:helloworld入門程序

 

 

第三步 啟動流程實例

 

[java] view plain copy/**  * 啟動流程實例  */  @Test  public void startProcessInstance() {      // 流程定義的key      String processDefinitionKey = "HelloWorld";      ProcessInstance pi = processEngine.getRuntimeService()// 于正在執行的流程實例和執行對象相關的Service              .startProcessInstanceByKey(processDefinitionKey);// 使用流程定義的key啟動流程實例,key對應hellworld.bpmn文件中id的屬性值,使用key值啟動,默認是按照最新版本的流程定義啟動      System.out.println("流程實例ID:" + pi.getId());// 流程實例ID 101      System.out.println("流程定義ID:" + pi.getProcessDefinitionId()); // 流程定義ID HelloWorld:1:4  運行結果為:

    流程實例ID:101

    流程定義ID:HelloWorld:1:4

 

第四步查詢當前辦理人的個人任務

[java] view plain copy/**  * 查詢當前人的個人任務  */  @Test  public void findMyPersonTask() {      String assignee = "張三";      List<Task> list = processEngine.getTaskService()// 與正在執行的認為管理相關的Service              .createTaskQuery()// 創建任務查詢對象              .taskAssignee(assignee)// 指定個人認為查詢,指定辦理人              .list();        if (list != null && list.size() > 0) {          for (Task task:list) {              System.out.println("任務ID:"+task.getId());              System.out.println("任務名稱:"+task.getName());              System.out.println("任務的創建時間"+task);              System.out.println("任務的辦理人:"+task.getAssignee());              System.out.println("流程實例ID:"+task.getProcessInstanceId());              System.out.println("執行對象ID:"+task.getExecutionId());              System.out.println("流程定義ID:"+task.getProcessDefinitionId());              System.out.println("#################################");          }      }  }  運行結果:

    任務ID:104

    任務名稱:提交申請

    任務的創建時間Task[id=104,name=提交申請]

    任務的辦理人:張三

    流程實例ID:101

    執行對象ID:101

    流程定義ID:HelloWorld:1:4

    #################################

 

 

第五步 完成任務

[java] view plain copy/**  * 完成我的任務  */  @Test  public void completeMyPersonTask(){      //任務Id      String taskId="104";      processEngine.getTaskService()//與正在執行的認為管理相關的Service              .complete(taskId);      System.out.println("完成任務:任務ID:"+taskId);    }  運行結果:

    完成任務:任務ID:104

 

 

    到這里我們就完成了一個簡單的helloworld,從畫一個流程圖、到部署流程定義、啟動流程實例、查詢當前辦理人的任務、完成當前的任務,從第二步開始每一步在數據庫中都會有相應的記錄進行添加、刪除、更新,我們運行產生的結果也都是從數據庫中查出來的記錄,關于每一步對應與數據庫中怎樣的變化,我們會在后續的文章繼續介紹。

 

六、后記

 

    我們本篇文章主要講述了activiti的環境準備包含各個軟件的版本和安裝流程設計器,接下來我們講解了兩種方式來創建activiti的23張表,還夾雜著一個數據庫連接url的寫法,接下來是activiti核心對象ProcessEngine,以及通過ProcessEngine獲取相關的Service,最后通過一個特別簡單的小demo來讓大家對部署流程定義、啟動流程實例、查詢當前任務、完成當前任務這些步驟有一個感性的認識,詳細的內容我們會在后續文章繼續介紹。

http://blog.csdn.net/zwk626542417/article/details/46594505


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人国产精品久久久久久亚洲| 日韩av一卡二卡| 尤物九九久久国产精品的特点| 国产精品一区二区久久| 国产精品1区2区在线观看| 欧美裸体xxxx极品少妇| 国产ts一区二区| 亚洲电影中文字幕| 久久久久久久久网站| 亚洲aⅴ日韩av电影在线观看| 国产日韩精品电影| 久久香蕉频线观| 秋霞av国产精品一区| 国产一区二区日韩| 欧美另类高清videos| 亚洲国产精品久久久久秋霞蜜臀| 7777精品久久久久久| 国产999精品| 国产美女被下药99| 欧美激情日韩图片| 精品香蕉在线观看视频一| 欧美日韩国产麻豆| 久久99国产精品自在自在app| 日韩在线观看免费全| 另类美女黄大片| 91视频88av| 国产精品久久久久久久一区探花| 亚洲精品成a人在线观看| 欧美激情videoshd| 亚洲国产精品va在看黑人| 国产精品久久久久久网站| 国产精品人成电影| 国产男人精品视频| 久久精品中文字幕电影| 色妞久久福利网| 国产精品亚洲欧美导航| 2021国产精品视频| 亚洲黄色在线观看| 综合网中文字幕| 国产网站欧美日韩免费精品在线观看| 亚洲一区二区三区乱码aⅴ蜜桃女| 狠狠操狠狠色综合网| 欧美精品在线播放| 美日韩丰满少妇在线观看| 国产成人精品电影久久久| 国产精品黄色av| 亚洲自拍欧美另类| 国产精品激情av电影在线观看| 午夜精品一区二区三区视频免费看| 午夜精品在线视频| 91精品成人久久| 97久久伊人激情网| 日本久久久久久久| 国产精品久久77777| 欧美激情网站在线观看| 亚洲精品av在线| 一区二区日韩精品| 欧美插天视频在线播放| 日韩精品在线免费观看| 人人爽久久涩噜噜噜网站| 国产精品亚洲一区二区三区| 国产91精品不卡视频| 欧美日产国产成人免费图片| 欧美激情精品在线| 日韩毛片在线观看| 国产在线观看精品一区二区三区| 在线电影av不卡网址| 久久天天躁狠狠躁夜夜躁| 日韩欧美第一页| 亚洲精品二三区| 亚洲毛片在线免费观看| 色婷婷**av毛片一区| 高清视频欧美一级| 欧美日韩国产一区在线| 国内揄拍国内精品| 日韩av电影手机在线| 国产一区二区三区高清在线观看| 日韩成人在线电影网| 韩剧1988免费观看全集| 欧美性视频网站| 成人疯狂猛交xxx| 国产一区在线播放| 日韩美女毛茸茸| 欧美大人香蕉在线| 欧美激情欧美激情在线五月| 美女撒尿一区二区三区| 狠狠久久亚洲欧美专区| 91av视频在线观看| 日韩精品免费视频| 国产一区二区三区在线视频| 欧美整片在线观看| 久久久久久久久久国产精品| 欧美高清视频在线播放| 国内揄拍国内精品少妇国语| 久久久久久久久久久免费精品| 亚洲国产日韩欧美综合久久| 91国产精品视频在线| 成人免费视频在线观看超级碰| 欧美在线观看视频| 国产精品扒开腿做| 国产精品白丝av嫩草影院| 日韩精品视频在线播放| 2020欧美日韩在线视频| 国产精品99免视看9| 国产精品一区二区女厕厕| 亚洲乱码国产乱码精品精| 91精品国产综合久久香蕉922| 国产综合色香蕉精品| 国产主播欧美精品| 亚洲欧美日韩精品| 亚洲第一av在线| 一个色综合导航| www日韩中文字幕在线看| 国产不卡av在线免费观看| 国产精品丝袜白浆摸在线| 性日韩欧美在线视频| 91在线免费网站| 亚洲国产精品系列| 精品成人久久av| 欧美视频专区一二在线观看| 色婷婷久久一区二区| 伊人伊人伊人久久| 亚洲va欧美va国产综合久久| 亚洲最大福利视频网站| 精品视频—区二区三区免费| 欧美视频中文在线看| 欧美另类老女人| 日韩av网站导航| 51ⅴ精品国产91久久久久久| 98精品国产自产在线观看| 国产精品一区二区三区免费视频| 亚洲精品自产拍| 国产成人亚洲综合| 狠狠爱在线视频一区| 成人综合网网址| 亚洲第一国产精品| 91精品视频免费观看| 亚洲欧美国产精品va在线观看| 国产一区二区黑人欧美xxxx| 亚洲天堂色网站| 91精品国产91| 日本免费在线精品| 欧美成年人视频网站欧美| 亚洲品质视频自拍网| 亚洲美女自拍视频| 成人乱人伦精品视频在线观看| 欧美成人sm免费视频| 亚洲欧美日韩图片| 国产欧美精品一区二区| 日韩精品福利在线| 一本一本久久a久久精品牛牛影视| 国产精品高潮呻吟久久av野狼| 九九久久精品一区| 国产精品久久久久久久久借妻| 日韩av在线一区二区| 久久精品99久久香蕉国产色戒| 国产精品扒开腿做| 国产91在线视频| 在线观看欧美日韩| 欧美大片网站在线观看| 成人免费淫片aa视频免费| 久久久久这里只有精品| 国产精品一香蕉国产线看观看| 国产成人亚洲综合91|