該版本的Activiti運行須知: 1.JDK 6+,Eclipse最好是Kepler以上版本。 2.試驗功能都有EXPERIMENTAL標註,被標註的部分不應該視為穩定的。 有興趣的同學可以去瞭解下Activiti Explorer項目,他涵蓋了大部分Activiti的功能,還沒有Activiti ...
該版本的Activiti運行須知:
1.JDK 6+,Eclipse最好是Kepler以上版本。
2.試驗功能都有EXPERIMENTAL標註,被標註的部分不應該視為穩定的。
有興趣的同學可以去瞭解下Activiti Explorer項目,他涵蓋了大部分Activiti的功能,還沒有Activiti概念的同學可以看看瞭解一下。
一、工作流開發之配置
Activiti沿用具有Spring配置文件風格的配置,工作流預設是載入名叫activiti.cfg.xml的文件,配置文件大體:
<beans xmlns="http://www.springframework.org/schema/beans" 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"> <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration"> <property name="jdbcUrl" value="jdbc:h2:mem:activiti;DB_CLOSE_DELAY=1000" /> <property name="jdbcDriver" value="org.h2.Driver" /> <property name="jdbcUsername" value="sa" /> <property name="jdbcPassword" value="" /> <property name="databaseSchemaUpdate" value="true" /> <property name="jobExecutorActivate" value="false" /> <property name="asyncExecutorEnabled" value="true" /> <property name="asyncExecutorActivate" value="false" /> <property name="mailServerHost" value="mail.my-corp.com" /> <property name="mailServerPort" value="5025" /> </bean> </beans>
而我們寫好配置文件,交給activiti載入有以下幾種方式:
ProcessEngineConfiguration.createProcessEngineConfigurationFromResourceDefault();
ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(String resource);
ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(String resource, String beanName);
ProcessEngineConfiguration.createProcessEngineConfigurationFromInputStream(InputStream inputStream);
ProcessEngineConfiguration.createProcessEngineConfigurationFromInputStream(InputStream inputStream, String beanName);
如果你喜歡零配置的話,可以:
ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration(); ProcessEngineConfiguration.createStandaloneInMemProcessEngineConfiguration();
比如零配置使用其中第二種方法:
1 ProcessEngine processEngine = ProcessEngineConfiguration.createStandaloneInMemProcessEngineConfiguration() 2 .setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_FALSE) 3 .setJdbcUrl("jdbc:h2:mem:my-own-db;DB_CLOSE_DELAY=1000") 4 .setAsyncExecutorEnabled(true) 5 .setAsyncExecutorActivate(false) 6 .buildProcessEngine();
不過我個人認為瑣碎的配置如果都交給代碼來維護的話,太費神了!況且交給代碼水平不高的程式員來寫的話,也不安全。所以還是交給xml吧,零配置除了新鮮沒用。
1.1 activiti.cfg.xml文件配置
activiti.cfg.xml
必須包含id為
processEngineConfiguration的bean節點,例如:
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
processEngineConfiguration通常用來構造ProcessEngine,activiti提供了以下4個類來定義processEngineConfiguration
:
-
org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration:通過獨立的方式獲得流程引擎對象,Activiti將自己管理事務,一般的,資料庫僅僅實在系統啟動的時候被檢測。
-
org.activiti.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration: 它主要用作測試。Activiti將自己管理事務,預設使用H2資料庫,資料庫表將在啟動被創建和關閉時被銷毀。所以也就沒多少配置了。
-
org.activiti.spring.SpringProcessEngineConfiguration: 它用作和Spring整合的。
-
org.activiti.engine.impl.cfg.JtaProcessEngineConfiguration: 在獨立模式中,使用了分散式事務可以使用它。(本人不怎麼清楚)
1.1.1 資料庫連接配置
資料庫連接目前有兩種配置,一種是使用MyBatis預設的資料庫連接配置,另外一種是主流的資料庫連接池。我是推薦後者的,因為前者的官方說明文檔裡面已經說了在生產上建議不使用預設的資料庫連接設置。
前者的配置如下:(簡單掠過)
<property name="jdbcUrl" value="jdbc:h2:mem:activiti;DB_CLOSE_DELAY=1000" /> <property name="jdbcDriver" value="org.h2.Driver" /> <property name="jdbcUsername" value="sa" /> <property name="jdbcPassword" value="" />
第二種方案:使用javax.sql.DataSource,比如DBCP,C3P0,Druid等
<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="activiti" /> <property name="password" value="activiti" /> <property name="defaultAutoCommit" value="false" /> </bean> <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration"> <property name="dataSource" ref="dataSource" /> ...
Activiti工作流並沒有提供資料庫連接池的Jar包,我們需要手動下載加到類路徑下麵。
無論使用那種資料庫連接方案,一些資料庫的其他配置需要關註:
databaseType:一般不需要,工作流內部會自動分析數據元,僅僅是在自動分析失敗後讀取該配置,目前支持的資料庫有 h2, mysql, oracle, postgres, mssql, db2。
databaseSchemaUpdate:
- false(預設值)---在流程引擎被創建的時候,檢查匹配資料庫中工作流版本和工作流jar包的工作流版本,不匹配將會拋出異常。
- true---在創建工作流引擎時候檢測匹配資料庫中工作流版本和工作流jar包的工作流版本,沒有就添加,有就修改。
- create-update:在創建工作流引擎時候添加工作流版本,關閉引擎的時候刪除工作流版本。
1.1.2 創建工作流相關的表
在類路徑下麵加入activiti的jar包,資料庫連接的jar,添加activiti.cfg.xml,然後運行DbSchemaCreate即可。
在生產上面往往開發者並沒有資料庫的管理員許可權,所以在activiti的jar中提供了sql給相關人員,這些表總的來說分為三大類:
- engine:這是必需的。
- identity:activiti提供的用戶管理功能的表。
- history:流程歷史記錄相關表
在MySQL上運行執行sql可要註意了,如果版本在5.5~5.6.3的請使用5.5版本的sql執行,或者就是升級資料庫5.6.4+,因為在5.6.4的以下版本的MySQL的timestamps或者 date精度沒有達到毫秒級,在工作流創建這一類列的話就會拋出異常。
1.1.3 工作流相關表的介紹
工作流相關的表全部是以“ACT_”開頭的,後面緊接著的第二部分是activiti提供的service的簡寫, 比如:
-
ACT_RE_*: RE 代表
repository
. 包含流程定義,流程資源等。 -
ACT_RU_*: RU 代表
runtime
. 這些表包含流程運行實例,任務、變數、分配工作等,這些表中僅僅存放運行數據,在流程實例執行結束後會被清除,這樣表中的數據比較少,它使得程式執行很快。 -
ACT_ID_*: ID 代表
identity
. 這些表包含了用戶信息數據,比如用戶個人信息,組信息等。 -
ACT_HI_*: HI 代表
history
. 這些表包含歷史數據,比如過去的流程實例,變數,任務等。 -
ACT_GE_*: 通用的數據表,被用來存放各種數據。