activiti工作流,OA工作流-Activiti(一)

 2023-12-06 阅读 19 评论 0

摘要:OA工作流-Activiti(一) 一、工作流定義 工作流:一系列相互銜接、自動進行的業務活動或任務。 OA工作流:建立于網絡辦公自動化基礎上的事務行政審批,業務申請審批、公文、信息等的網上流轉。它主要解決的是“使在多個參與者之間按照某種預定義的規則傳遞文

OA工作流-Activiti(一)


一、工作流定義



工作流一系列相互銜接、自動進行的業務活動或任務。


OA工作流建立于網絡辦公自動化基礎上的事務行政審批,業務申請審批、公文、信息等的網上流轉。它主要解決的是使在多個參與者之間按照某種預定義的規則傳遞文檔、信息或任務的過程自動進行,從而實現某個預期的業務目標,或者促使此目標的實現

? ? ? ? 不同于以往我們在僅僅進行增刪改查(CRUD),我們還要對其進行??下訂單--訂單確認--財務收款--庫管配貨--運送? 等等一系列操作。


工作流管理系統(Workflow Management System, WfMS)是一個軟件系統,它完成工作量的定義和管理,并按照在系統中預先定義好的工作流規則進行工作流實例的執行。工作流管理系統不是企業的業務系統,而是為企業的業務系統的運行提供了一個軟件的支撐環境。

二、Activiti簡介

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

此圖未插件繪制:

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



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

?

數據庫(流程數據24張表):

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

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

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

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

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

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


數據庫流程規則表:

? ? ?

? ? ? ? 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屬性數據表存儲整個流程引擎級別的數據,初始化表結構時,會默認插入三條記錄,

activiti.cfg.xmlactiviti的配置文件)


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

定義數據庫配置參數:

l?jdbcUrl:?數據庫的JDBC URL

l?jdbcDriver:?對應不同數據庫類型的驅動。

l?jdbcUsername:?連接數據庫的用戶名。

l?jdbcPassword:?連接數據庫的密碼。

基于JDBC參數配置的數據庫連接 會使用默認的MyBatis連接池。?下面的參數可以用來配置連接池(來自MyBatis參數):

l?jdbcMaxActiveConnections:?連接池中處于被使用狀態的連接的最大值。默認為10

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

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

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

<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/itcast0711activiti?useUnicode=true&characterEncoding=utf8"></property><property name="jdbcUsername" value="root"></property><property name="jdbcPassword" value="root"></property><!-- 沒有表創建表 --><property name="databaseSchemaUpdate" value="true"></property></bean>

注意:

1,流程數據需要24張表,全部都是Activiti的底層表,默認使用MyBatis進行操作。

2,工作流的表僅僅是用來進行存放流程數據的,而業務數據需要自己創建和維護,一定要自己進行關聯表(業務和流程表)

三、準備環境

3.1activiti5 軟件環境

1)?JDK1.6+

2)?支持的數據庫有:h2, mysql, oracle, postgres, mssql, db2等。

3)?支持activiti5運行的jar包

4)?開發環境為Eclipse3.7+,myeclipse為8.6+

3.2相關資源下載

Activiti官方網站:http://activiti.org/download.html

其他資源到相關網站去下載即可。

3.3安裝流程

? ? ?3.3.1安裝方式一

1)?打開?Help -> Install New Software. 在如下面板中:

?????????????

2)?在如下Install界面板中,點擊Add按鈕配置新裝插件的地址和名稱


3)?然后填入下列字段

Name: Activiti BPMN 2.0 designer

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

??????

4)?回到Install界面,把所有展示出來的項目都勾上:

5)?點擊next完成安裝,安裝完以后,點擊新建工程new->Other…打開面板,如果看到下圖內容:


? ? ? 3.3.2安裝方式2:

1,http://www.activiti.org/designer/archived/?下載

? ? ? ? ? ? ? ? 解壓? ??

2,打開eclipse根目錄diopins文件夾將內容放進去

3,重啟eclipse new-others查看信息


3.4流程設計器的使用說明

菜單Windows->Preferences->Activiti->Save

?打上勾后Activiti畫圖工具會在流程文件保存時自動生成一張流程圖

?完成上面的配置之后由我們自己來管理流程圖片。

3.5activiti開發環境配置

? ?3.5.1添加jar包 建立

? ? ? ? ? ? ??新建maven工程,加入在pom文件中加入指定jar


<properties><activiti-version>5.11</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><dependency><groupId>org.codehaus.groovy</groupId><artifactId>groovy-all</artifactId><version>2.0.4</version></dependency><dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><version>1.3.168</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.8.1</version></dependency></dependencies><repositories><repository><id>Activiti</id><url>http://maven.alfresco.com/nexus/content/repositories/activiti</url></repository></repositories><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.3.2</version><configuration><source>1.6</source><target>1.6</target></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-eclipse-plugin</artifactId><inherited>true</inherited><configuration><classpathContainers><classpathContainer>org.eclipse.jdt.USER_LIBRARY/Activiti Designer Extensions</classpathContainer></classpathContainers></configuration></plugin></plugins></build>
</project>

3.5.2 使用Test類測試

??寫一個Test類,調用里面自帶的方法可以自動生成24張表

/**使用代碼創建工作流需要的23張表*/
? ?

 @Testpublic void createTable(){ProcessEngineConfiguration processEngineConfiguration = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();//連接數據庫的配置processEngineConfiguration.setJdbcDriver("com.mysql.jdbc.Driver");processEngineConfiguration.setJdbcUrl("jdbc:mysql://localhost:3306/itcast0711activiti?useUnicode=true&characterEncoding=utf8");processEngineConfiguration.setJdbcUsername("root");processEngineConfiguration.setJdbcPassword("root");/**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:"+processEngine);}

3.5.3使用配置文件activiti.cfg.xml

配置如下:

<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/itcast0711activiti?useUnicode=true&characterEncoding=utf8"></property><property name="jdbcUsername" value="root"></property><property name="jdbcPassword" value="root"></property><!-- 沒有表創建表 --><property name="databaseSchemaUpdate" value="true"></property></bean>


寫測試類Test2

/**使用配置文件創建工作流需要的23張表*/
?

   @Testpublic void createTable_2(){
//        ProcessEngineConfiguration processEngineConfiguration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
//        //工作流的核心對象,ProcessEnginee對象
//        ProcessEngine processEngine = processEngineConfiguration.buildProcessEngine();ProcessEngine processEngine = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml")    //.buildProcessEngine();System.out.println("processEngine:"+processEngine);}

3.5.4添加log4.j

log4j.rootLogger=WARN, CA# ConsoleAppender
log4j.appender.CA=org.apache.log4j.ConsoleAppender
log4j.appender.CA.layout=org.apache.log4j.PatternLayout
log4j.appender.CA.layout.ConversionPattern= %d{hh:mm:ss,SSS} [%t] %-5p %c %x - %m%n


四、核心API

4.1 ProcessEngine? --在Activiti中最核心的類,其他的類都是由他而來


調用ProcessEnginesgetDefaultProceeEngine方法時會自動加載classpath下名為activiti.cfg.xml文件

通過get方法就可以獲取各個service

例:

各個Service的作用:


4.2?RepositoryService

? 是Activiti的倉庫服務類。所謂的倉庫指流程定義文檔的兩個文件:bpmn文件和流程圖片。

4.3?RuntimeService

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

4.4:TaskService

activiti的任務服務類。可以從這個類中獲取任務的信息。

4.5:HistoryService

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

4.6ProcessDefinition

流程定義類。可以從這里獲得資源文件等。

4.7ProcessInstance

代表流程定義的執行實例。如范冰冰請了一天的假,她就必須發出一個流程實例的申請。一個流程實例包括了所有的運行節點。我們可以利用這個對象來了解當前流程實例的進度等信息。流程實例就表示一個流程從開始到結束的最大的流程分支,即一個流程中流程實例只有一個。

4.8Execution

Activiti用這個對象去描述流程執行的每一個節點。在沒有并發的情況下,Execution就是同ProcessInstance流程按照流程定義的規則執行一次的過程,就可以表示執行對象Execution

*?一個流程中,執行對象可以存在多個,但是流程實例只能有一個。

*?當流程按照規則只執行一次的時候,那么流程實例就是執行對象。

五、模擬流程的執行

5.1進行下面流程的Test測試!!


通過Activiti Diagram創建流程圖

5.2部署流程定義

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();/**部署流程定義*/@Testpublic void deploymentProcessDefinition(){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());//1System.out.println("部署名稱:"+deployment.getName());//helloworld入門程序  }

5.3 啟動流程

	/**啟動流程實例*/@Testpublic void startProcessInstance(){//流程定義的keyString processDefinitionKey = "helloworld";ProcessInstance pi = processEngine.getRuntimeService()//與正在執行的流程實例和執行對象相關的Service.startProcessInstanceByKey(processDefinitionKey);//使用流程定義的key啟動流程實例,key對應helloworld.bpmn文件中id的屬性值,使用key值啟動,默認是按照最新版本的流程定義啟動System.out.println("流程實例ID:"+pi.getId());//流程實例ID    101System.out.println("流程定義ID:"+pi.getProcessDefinitionId());//流程定義ID   helloworld:1:4}

5.4查詢當前任務

/**查詢當前人的個人任務*/@Testpublic void findMyPersonalTask(){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.getCreateTime());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("########################################################");}}}

5.5完成當前任務

/**完成我的任務*/@Testpublic void completeMyPersonalTask(){//任務IDString taskId = "302";processEngine.getTaskService()//與正在執行的任務管理相關的Service.complete(taskId);System.out.println("完成任務:任務ID:"+taskId);}
不懂的可以在下面評論

歡迎訂閱關注公眾號(JAVA和人工智能)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?獲取更多免費書籍、資源、視頻資料


? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://808629.com/190722.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 86后生记录生活 Inc. 保留所有权利。

底部版权信息