activity(工作流)初步學習記錄


1.概念

 

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

 

2.Activity介紹

  

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

流程圖。

 

3.工作流引擎

 

ProcessEngine對象,這是Activiti工作的核心。負責生成流程運行時的各種實例及數據、監控和管理流程的運行。

4:數據庫

Activiti數據庫支持:

Activiti的后台是有數據庫的支持,所有的表都以ACT_開頭。 第二部分是表示表的用途的兩個字母標識。 用途也和服務的API對應。

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

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

ACT_ID_*: 'ID'表示identity。 這些表包含身份信息,比如用戶,組等等。

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

ACT_GE_*: 通用數據, 用於不同場景下,如存放資源文件。

 

4.1表結構

 

資源庫流程規則表

1) act_re_deployment 部署信息表

2) act_re_model   流程設計模型部署表

3) act_re_procdef   流程定義數據表

運行時數據庫表

1) act_ru_execution 運行時流程執行實例表

2) act_ru_identitylink 運行時流程人員表,主要存儲任務節點與參與者的相關信息

3) act_ru_task 運行時任務節點表

4) act_ru_variable 運行時流程變量數據表

歷史數據庫表

1) act_hi_actinst 歷史節點表

2) act_hi_attachment 歷史附件表

3) act_hi_comment 歷史意見表

4) act_hi_identitylink 歷史流程人員表

5) act_hi_detail 歷史詳情表,提供歷史變量的查詢

6) act_hi_procinst 歷史流程實例表

7) act_hi_taskinst 歷史任務實例表

8) act_hi_varinst 歷史變量表

組織機構表

1) act_id_group 用戶組信息表

2) act_id_info 用戶擴展信息表

3) act_id_membership 用戶與用戶組對應信息表

4) act_id_user 用戶信息表

這四張表很常見,基本的組織機構管理,關於用戶認證方面建議還是自己開發一套,組件自帶的功能太簡單,使用中有很多需求難以滿足

通用數據表

1) act_ge_bytearray 二進制數據表

2) act_ge_property 屬性數據表存儲整個流程引擎級別的數據,初始化表結構時,會默認插入三條記錄

 

5.activiti.cfg.xml(activiti的配置文件)

Activiti核心配置文件,配置流程引擎創建工具的基本參數和數據庫連接池參數。

定義數據庫配置參數:

jdbcUrl: 數據庫的JDBC URL。
jdbcDriver: 對應不同數據庫類型的驅動。
jdbcUsername: 連接數據庫的用戶名。
jdbcPassword: 連接數據庫的密碼。
基於JDBC參數配置的數據庫連接 會使用默認的MyBatis連接池。 下面的參數可以用來配置連接池(來自MyBatis參數):
jdbcMaxActiveConnections: 連接池中處於被使用狀態的連接的最大值。默認為10。

jdbcMaxIdleConnections: 連接池中處於空閑狀態的連接的最大值。

jdbcMaxCheckoutTime: 連接被取出使用的最長時間,超過時間會被強制回收。 默認為20000(20秒)。

jdbcMaxWaitTime: 這是一個底層配置,讓連接池可以在長時間無法獲得連接時, 打印一條日志,並重新嘗試獲取一個連接。(避免因為錯誤配置導致沉默的操作失敗)。 默認為20000(20秒)。

6.准備工作

  1.下載activity(Activity官網下載)

  http://activiti.org/download.html

  2.Eclipse安裝流程設計器插件

  在有網絡情況下:

    打開 Help -> Install New Software,如下圖:

    

 

  點擊Add按鈕,裝配新插件名稱的地址,填下以下字段

    

  Name: Activiti BPMN 2.0 designer

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

  

    回到Install界面,在面板正中列表中把所有展示出來的項目都勾上,並且把下圖紅色框框的勾上,它會檢查所有當前安裝所需要的插件並可以被Eclipse下載

 

 

 

  安裝完以后,點擊新建工程new->Other…打開面板,如果看到下圖:說明安裝插件已經成功。

 

 

下面是准備開發環境:

在activiti-5.22->wars目錄下是一些示例項目,解壓activiti-rest項目,導入activiti-rest目錄中WEB-INF\lib下所有包。添加到classpath中。

由於我們使用的是Mysql數據庫,Mysql數據庫的鏈接驅動Activiti官方包中並沒有提供,需要我們自己導入。手動導入mysql-connector-java.jar,添加到classpath下。(本人用的用maven工程導入依賴)

初始化數據庫:

復制代碼
@Test
    public  void test() {
        //1.創建Activity配置對象的實例
        ProcessEngineConfiguration configuration  = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();
        //2.設置數據庫連接信息
        //設置數據庫地址
        configuration.setJdbcUrl("jdbc:mysql://localhost:3306/activity?createDatabaseIfNotExist=true");
        //數據庫驅動
        configuration.setJdbcDriver("com.mysql.jdbc.Driver");
        //用戶名
        configuration.setJdbcUsername("root");
        //密碼
        configuration.setJdbcPassword("");
        //設置數據建表策略
        /**
         *DB_SCHEMA_UPDATE_TRUE 如果不存在表就創建表,存在表就使用
         */
        configuration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
        //3.使用配置對象創建流程引擎實例(檢查數據庫等連接環境)
        ProcessEngine processEngine = configuration.buildProcessEngine();
        System.out.println(processEngine);
    }
復制代碼

 

執行成功,數據庫會生成25張表。

(在Actiiti5中定制流程必定會操作到數據庫,如果都像上面那樣寫一大段代碼會非常麻煩,所以我們可以把數據庫連接配置寫入配置文件。一個類似spring結構的配置文件,清空內容后改名為activiti.cfg.xml,用來做流程引擎的相關配置。主要定義了數據庫連接和建表策略。)

下面是配置文件連接數據庫與創建表的過程:

activiti.cfg.xml:

復制代碼
<?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"
  xmlns:jee="http://www.springframework.org/schema/jee" xmlns:aop="http://www.springframework.org/schema/aop"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
       http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-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/activity2"></property>
        <property name="jdbcUsername" value="root"></property>
        <property name="jdbcPassword" value=""></property>
        <!--建表策略-->
        <property name="databaseSchemaUpdate" value="true"></property>
    </bean>
  
</beans>
復制代碼

需要把log4j.properties添加到resource

測試類:

復制代碼
/**
     * 使用配置文件
     */
    @Test
    public void test2() throws Exception{
        ProcessEngine processEngine = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml").buildProcessEngine();
        System.out.println(processEngine);
    }
復制代碼

下一步:

 創建helloword.bpmn,同時這是一個xml文件,創建完后會生成一張流程圖的(不一一描述)

下面是第一個入門程序編寫模擬

復制代碼
//調用引擎,初始化
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    /**
     * 部署流程定義
     */
    @Test
    public void deployment() {
        Deployment deployment = processEngine.getRepositoryService()//與流程定義和部署相關的Service
                .createDeployment()//創建一個部署對象
                .name("helloword")//添加部署的名稱
                .addClasspathResource("diagrams/helloword.bpmn")//從classpath下加載資源,一次一個
                .addClasspathResource("diagrams/helloword.png")
                .deploy();//完成部署
            System.out.println("部署ID"+deployment.getId());//1
            System.out.println("部署名稱"+deployment.getName());
    }
    
    /**
     *啟動流程實例
     */
    @Test
    public void startProcessInstance() {
        String processDefinitionKey = "helloword";
        ProcessInstance processInstance = processEngine.getRuntimeService()//與正在執行的流程實例和執行對象相關的Service
                .startProcessInstanceByKey(processDefinitionKey);//根據Key值來查詢流程,也可以根據ID
        System.out.println("流程實例ID:"+processInstance.getId());  //2501
                                                                    //對應數據庫act_ru_execution
        System.out.println("流程定義ID:"+processInstance.getProcessDefinitionId()); //helloword:1:4
                                                                                //對應數據庫act_re_deployment
    }
    
    /**
     * 查詢當前個人的任務
     */
    @Test
    public void fingByPerson() {
        String assignee = "張三";
        List<Task> list = processEngine.getTaskService()//與正在執行的任務管理相關的Service
                .createTaskQuery()//創建任務查詢對象
                .taskAssignee(assignee)//指定個人任務查詢,指定代理人
                .list();//以list形式記錄對象
        if(list != null && list.size()>0) {
            for(Task task:list) {
                System.out.println("任務ID:"+task.getId());//2501
                System.out.println("任務名稱:"+task.getName());//提交申請
                System.out.println("任務的創建時間:"+task.getCreateTime());//Wed Jun 06 18:12:15 CST 2018
                System.out.println("任務的代理人:"+task.getAssignee());//張三
                System.out.println("流程實例ID:"+task.getProcessInstanceId());//2501
                System.out.println("執行對象ID:"+task.getExecutionId());//2501
                System.out.println("流程定義ID:"+task.getProcessDefinitionId());//helloword:1:4
            }
        }
    }
    
    /**
     * 完成個人任務
     */
    @Test
    public void complete() {
        String taskId = "2504";
        processEngine.getTaskService()
            .complete(taskId );
        System.out.println("完成任務ID:"+taskId);
    }
復制代碼

以上代碼模擬了一個流程執行的流程:部署----啟動流程實例-----查詢當前正在執行的流程-----然后提交,當前(提交申請)的流程結束----會轉到下一個流程執行者處理。

 

張三提交申請完成:

 

 

 

會把流程傳送到部門經理(李四)審核,李四審核后傳到總經理王五審核

 

 

 數據庫會記錄流程的信息


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM