Activiti第一篇【介紹、配置開發環境、快速入門】

Activiti介紹

什麼是Activiti?

Activiti5是由Alfresco軟件在2010年5月17日發佈的業務流程管理(BPM)框架,它是覆蓋了業務流程管理、工做流、服務協做等領域的一個開源的、靈活的、易擴展的可執行流程語言框架。Activiti基於Apache許可的開源BPM平臺,創始人Tom Baeyens是JBoss jBPM的項目架構師,它特點是提供了eclipse插件,開發人員能夠經過插件直接繪畫出業務
流程圖。html

咱們即將學習的是一個業務流程管理框架, 常見開源工做流引擎框架 : OSWorkFlow、jBPM(jboss business process management),Activiti工做流(是對jBPM升級)。通常咱們稱做爲工做流框架..java

爲何要學習Activiti

那咱們爲何要學習業務流程管理框架呢???學習它幹嗎???工做流(Workflow),就是「業務過程的部分或總體在計算機應用環境下的自動化」mysql

咱們來提出一個常見的需求來更好地理解:web

咱們在學生時代,確定會遇到請假寫請假條的狀況,若是學校的請假抓得很是嚴,就須要通過多層的贊成才能肯定能不能請假..spring

這裏寫圖片描述

班主任->任課老師->教學總監->校長這麼一個流程,首先咱們先明確一點:咱們做爲一個學生,不可能直接跳過老師,去找校長申請請假的【校長是你隨便找的嗎??】sql

所以咱們請假的流程是一步一步的,並不能作跳躍數據庫

也就是說,當班主任沒有批准請假的時候,即便你去找任課老師了,任課老師會讓你回去找班主任的,做爲任課老師了,只關注班主任有沒有批准你請假,同理,做爲校長,只關注教學總監有沒有批准你請假express

進一步說:當教學總監尚未批准你請假時,你請假的請求是不會出如今校長的範圍裏的json

實際上是很是好理解的,就是一步步往下執行,當尚未執行到本身處理的點子上時,是不會有對應的處理請求的。分工有序api

對上面的請假流程進行分析,若是咱們沒有使用框架,而把這麼一個請假流程寫到咱們的網站中,咱們會怎麼作呢??

這裏寫圖片描述

咱們須要維護一個變量,來不斷傳遞過去給下一個處理者…若是一切正常,需求不會變,並無條件的處理。這是咱們很是但願看到的…可是,若是有條件判斷【請假三天如下、請假三天以上的處理方式不同】,需求會變【不須要校長批准了,教學總監批准完,你就可以請假了】,那麼咱們的代碼就會變得亂

基於這麼一個緣由,咱們是須要學習一個框架來幫咱們完成工做流的…

採用工做流管理系統的優勢

  • 一、提升系統的柔性,適應業務流程的變化
  • 二、實現更好的業務過程控制,提升顧客服務質量
  • 三、下降系統開發和維護成本

快速入門Activiti

首先咱們來梳理一下Activiti的開發步驟:

  1. 咱們要用到一個工做流,首先就要把這個工做流定義出來【也就是工做流的步驟的怎麼樣的】,Activiti支持以「圖」的方式來定義工做流
  2. 定義完工做流,就要部署到起來【咱們能夠聯想到Tomcat,咱們光下載了Tomcat是沒有用的,要把它部署起來】
  3. 隨後咱們就執行該工做流,該工做流就隨着咱們定義的步驟來一一執行!

BPMN

業務流程建模與標註(Business Process Model and Notation,BPMN) ,描述流程的基本符號,包括這些圖元如何組合成一個業務流程圖(Business Process Diagram)

BPMN這個就是咱們所謂把工做流定義出來的流程圖..

數據庫相關

咱們在執行工做流步驟的時候會涉及到不少數據【執行該流程的人是誰、所須要的參數是什麼、包括想查看以前流程執行的記錄等等】,所以咱們會須要用到數據庫的表來保存數據…

因爲咱們使用的是Activiti框架,這個框架會自動幫咱們把對應的數據庫表建立起來,它涉及的表有23個,可是經常使用的並非不少,所以也不用很慌…

下面就列舉一下表的狀況

Activiti的後臺是有數據庫的支持,全部的表都以ACT_開頭。 第二部分是表示表的用途的兩個字母標識。 用途也和服務的API對應。
ACT_RE_*: 'RE'表示repository。 這個前綴的表包含了流程定義和流程靜態資源 (圖片,規則,等等)。
ACT_RU_*: 'RU'表示runtime。 這些運行時的表,包含流程實例,任務,變量,異步任務,等運行中的數據。 Activiti只在流程實例執行過程當中保存這些數據, 在流程結束時就會刪除這些記錄。 這樣運行時表能夠一直很小速度很快。
ACT_ID_*: 'ID'表示identity。 這些表包含身份信息,好比用戶,組等等。
ACT_HI_*: 'HI'表示history。 這些表包含歷史數據,好比歷史流程實例, 變量,任務等等。
ACT_GE_*: 通用數據, 用於不一樣場景下,如存放資源文件。

搭建配置環境

我這裏使用的Intellij idea來使用Activiti,首先,咱們得下載插件來使用Activiti【由於定義流程圖須要用到插件】

詳情能夠看這篇博文:http://blog.sina.com.cn/s/blog_4b3196670102woix.html

Activiti插件中文亂碼問題:

http://www.cnblogs.com/mymelody/p/6049291.html

流程以前的連線是經過圖中的藍色小點點拖動來進行鏈接的

導入對應的jar包

  • activation-1.1.jar
  • activiti-bpmn-converter-5.13.jar
  • activiti-bpmn-layout-5.13.jar
  • activiti-bpmn-model-5.13.jar
  • activiti-common-rest-5.13.jar
  • activiti-engine-5.13.jar
  • activiti-json-converter-5.13.jar
  • activiti-rest-5.13.jar
  • activiti-simple-workflow-5.13.jar
  • activiti-spring-5.13.jar
  • aopalliance-1.0.jar
  • commons-dbcp-1.4.jar
  • commons-email-1.2.jar
  • commons-fileupload-1.2.2.jar
  • commons-io-2.0.1.jar
  • commons-lang-2.4.jar
  • commons-pool-1.5.4.jar
  • h2-1.3.170.jar
  • hamcrest-core-1.3.jar
  • jackson-core-asl-1.9.9.jar
  • jackson-mapper-asl-1.9.9.jar
  • javaGeom-0.11.0.jar
  • jcl-over-slf4j-1.7.2.jar
  • jgraphx-1.10.4.2.jar
  • joda-time-2.1.jar
  • junit-4.11.jar
  • log4j-1.2.17.jar
  • mail-1.4.1.jar
  • mybatis-3.2.2.jar
  • mysql-connector-java.jar
  • org.restlet.ext.fileupload-2.0.15.jar
  • org.restlet.ext.jackson-2.0.15.jar
  • org.restlet.ext.servlet-2.0.15.jar
  • org.restlet-2.0.15.jar
  • slf4j-api-1.7.2.jar
  • slf4j-log4j12-1.7.2.jar
  • spring-aop-3.1.2.RELEASE.jar
  • spring-asm-3.1.2.RELEASE.jar
  • spring-beans-3.1.2.RELEASE.jar
  • spring-context-3.1.2.RELEASE.jar
  • spring-core-3.1.2.RELEASE.jar
  • spring-expression-3.1.2.RELEASE.jar
  • spring-jdbc-3.1.2.RELEASE.jar
  • spring-orm-3.1.2.RELEASE.jar
  • spring-tx-3.1.2.RELEASE.jar

開發步驟

上面已經說過了,咱們要想使用Activiti就須要有數據庫的支持,雖然Activiti是自動幫咱們建立對應的數據庫表,可是咱們是須要配置數據庫的信息的。咱們配置數據庫的信息,接着拿到Activiti最重要的API——Activiti引擎

這裏寫圖片描述

獲得工做流引擎

Activiti提供使用代碼的方式來配置數據庫的信息

 @Test public void createActivitiEngine(){ /* *1.經過代碼形式建立 * - 取得ProcessEngineConfiguration對象 * - 設置數據庫鏈接屬性 * - 設置建立表的策略 (當沒有表時,自動建立表) * - 經過ProcessEngineConfiguration對象建立 ProcessEngine 對象*/ //取得ProcessEngineConfiguration對象 ProcessEngineConfiguration engineConfiguration=ProcessEngineConfiguration. createStandaloneProcessEngineConfiguration(); //設置數據庫鏈接屬性 engineConfiguration.setJdbcDriver("com.mysql.jdbc.Driver"); engineConfiguration.setJdbcUrl("jdbc:mysql://localhost:3306/activitiDB?createDatabaseIfNotExist=true" + "&useUnicode=true&characterEncoding=utf8"); engineConfiguration.setJdbcUsername("root"); engineConfiguration.setJdbcPassword("root"); // 設置建立表的策略 (當沒有表時,自動建立表) // public static final java.lang.String DB_SCHEMA_UPDATE_FALSE = "false";//不會自動建立表,沒有表,則拋異常 // public static final java.lang.String DB_SCHEMA_UPDATE_CREATE_DROP = "create-drop";//先刪除,再建立表 // public static final java.lang.String DB_SCHEMA_UPDATE_TRUE = "true";//假如沒有表,則自動建立 engineConfiguration.setDatabaseSchemaUpdate("true"); //經過ProcessEngineConfiguration對象建立 ProcessEngine 對象 ProcessEngine processEngine = engineConfiguration.buildProcessEngine(); System.out.println("流程引擎建立成功!"); }

Activiti也能夠經過配置文件來配置數據庫的信息,加載配置文件從而獲得工做流引擎

/**2. 經過加載 activiti.cfg.xml 獲取 流程引擎 和自動建立數據庫及表 * ProcessEngineConfiguration engineConfiguration= ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml"); //從類加載路徑中查找資源 activiti.cfg.xm文件名能夠自定義 ProcessEngine processEngine = engineConfiguration.buildProcessEngine(); System.out.println("使用配置文件Activiti.cfg.xml獲取流程引擎"); */

這裏寫圖片描述

上面的那種加載配置文件方式,配置文件的名字是能夠自定義的,若是咱們配置文件的名字默認就是activiti.cfg.xml的話,也是放在類路徑下,咱們就可使用默認的方式來進行加載了!

 @Test public void createActivitiEngine(){ /** * 3. 經過ProcessEngines 來獲取默認的流程引擎 */ // 默認會加載類路徑下的 activiti.cfg.xml ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); System.out.println("經過ProcessEngines 來獲取流程引擎"); } 

定義工做流

定義工做流就須要咱們剛纔下載的插件了,咱們是使用圖形的方式來定義工做流的….

這裏寫圖片描述

在每一個流程中,咱們均可以指定對應的處理人是誰,交由誰處理

部署工做流

咱們上面已經定義了工做流了,工做流引擎咱們也已經拿到了,接下來就是把工做流部署到工做流引擎中了

@Test
    public void deploy() {

        //獲取倉庫服務 :管理流程定義
        RepositoryService repositoryService = processEngine.getRepositoryService();
        Deployment deploy = repositoryService.createDeployment()//建立一個部署的構建器
                .addClasspathResource("LeaveActiviti.bpmn")//從類路徑中添加資源,一次只能添加一個資源
                .name("請求單流程")//設置部署的名稱
                .category("辦公類別")//設置部署的類別
                .deploy();

        System.out.println("部署的id"+deploy.getId());
        System.out.println("部署的名稱"+deploy.getName());
    }

相對應的數據庫表就會插入數據、涉及到的數據庫表後面會詳細說明。如今咱們只要瞭解到,咱們工做流引擎執行操做會有數據庫表記錄

這裏寫圖片描述


執行工做流

指定指定工做流就是咱們定義時工做流程表的id

這裏寫圖片描述

 @Test public void startProcess(){ //指定執行咱們剛纔部署的工做流程 String processDefiKey="leaveBill"; //取運行時服務 RuntimeService runtimeService = processEngine.getRuntimeService(); //取得流程實例 ProcessInstance pi = runtimeService.startProcessInstanceByKey(processDefiKey);//經過流程定義的key 來執行流程 System.out.println("流程實例id:"+pi.getId());//流程實例id System.out.println("流程定義id:"+pi.getProcessDefinitionId());//輸出流程定義的id }

查詢當前任務的信息

剛纔咱們已經開始了工做流了,隨後工做流應該去到了申請請假的流程,申請請假的處理人是鍾福成,咱們能夠查詢出對應的信息:

//查詢任務
    @Test
    public void queryTask(){
        //任務的辦理人
        String assignee="鍾福成";
        //取得任務服務
        TaskService taskService = processEngine.getTaskService();
        //建立一個任務查詢對象
        TaskQuery taskQuery = taskService.createTaskQuery();
        //辦理人的任務列表
        List<Task> list = taskQuery.taskAssignee(assignee)//指定辦理人
                .list();
        //遍歷任務列表
        if(list!=null&&list.size()>0){
            for(Task task:list){
                System.out.println("任務的辦理人:"+task.getAssignee());
                System.out.println("任務的id:"+task.getId());
                System.out.println("任務的名稱:"+task.getName());
            }
        }
    }

這裏寫圖片描述

處理任務

咱們如今處理流程去到「申請請假」中,處理人是鍾福成…接着就是鍾福成去處理任務,根據任務的id使得流程繼續往下走

任務的id剛纔咱們已經查詢出來了【上面】,咱們若是是在web端操做數據的話,那麼只要傳遞過去就好了!

 //完成任務 @Test public void compileTask(){ String taskId="304"; //taskId:任務id processEngine.getTaskService().complete(taskId); System.out.println("當前任務執行完畢"); }

這裏寫圖片描述

當咱們處理完該任務的時候,就到了批准【班主任】任務了,咱們查詢一下是否是如咱們想象的效果:

這裏寫圖片描述

咱們按照定義的工做流程圖一步一步往下走,最終把流程走完

這裏寫圖片描述

相關文章
相關標籤/搜索