Activiti 開源工做流是也;java
必要的軟件mysql
JDK 6+spring
Eclipse
BPMN插件( Activiti Designer編輯器)的安裝sql
打開 Help -> Install New Software. 在以下面板中 , 點擊 Add 按鈕, 而後填入下列字段:數據庫
· Name: Activiti BPMN 2.0 designeroracle
· Location: http://activiti.org/designer/update/tcp
Activiti 流程引擎的配置文件是名爲:activiti.cfg.xml,注意:這與Spring方式建立流程殷勤是不同樣的編輯器
ProcessEngineConfigurationide
目前可使用的類:以下:
1. org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration:sqlserver
單獨運行的流程引擎。Activiti會本身處理事務。默認數據庫只在引擎啓動時檢測(若是Activiti的表或者表結構不正確就會拋出異常)
2.org.activiti.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration:
單元測試時的輔助類。Activiti會本身控制事務。 默認使用H2內存數據庫。數據庫表會在引擎啓動時建立,關閉時刪除。使用它時,不須要其餘配置(除非使用job執行器或郵件功能)。
3. org.activiti.spring.SpringProcessEngineConfiguration:
在Spring環境下使用流程引擎。
4. org.activiti.engine.impl.cfg.JtaProcessEngineConfiguration:
單獨運行流程引擎,並使用JTA事務。
支持的數據庫:
Activiti數據庫類型 |
JDBC URL實例 |
備註 |
h2 |
jdbc:h2:tcp://localhost/activiti |
默認配置的數據庫 |
mysql |
jdbc:mysql://localhost:3306/activiti?autoReconnect=true |
使用mysql-connector-java驅動測試 |
oracle |
jdbc:oracle:thin:@localhost:1521:xe |
|
postgres |
jdbc:postgresql://localhost:5432/activiti |
|
db2 |
jdbc:db2://localhost:50000/activiti |
|
mssql |
jdbc:sqlserver://localhost:1433/activiti |
理解數據庫表的命名
Activiti的表都以ACT_開頭。第二部分是表示表的用途的兩個字母標識。用途也和服務的API對應。
1.ACT_RE_* :‘RE’表示Repository。這個前綴的表包含了流程定義和流程靜態資源(圖片,規則,等等)
2. ACT_RU_*:‘RU’表示runtime。這是運行時的表存儲着流程變量,用戶任務,變量,職責(job)等運行時的數據。Activiti只存儲實例執行期間的運行時數據,當流程實例結束時,將刪除這些記錄。這就保證了這些運行時的表小且快。
3.ACT_ID_*:‘ID’表示identity。這些表包含標識的信息,如用戶,用戶組,等;
4.ACT_HI_*:‘history’。就是這些表包含着歷史的相關數據,如結束的流程實例,變量,任務,等;
5.ACT_GE_*:普通數據,各類狀況都使用的數據;
數據庫表結構圖:
名詞解釋:
關鍵對象
Deployment:流程部署對象,部署一個流程是建立。
ProcessDefinitions:流程定義,部署 成功後自動建立。
ProcessInstances:流程實例,啓動流程是建立。
Task:任務,在Activiti中的Task僅值有角色參與的任務,即定義中的UserTask。
Execution:執行計劃,流程實例和流程執行中的全部節點都是Execution,如UserTask、ServiceTask等。
服務接口
ProcessEngine:流程引擎接口,提供流程管理和運做的全部接口。
RuntimeService:運行時服務接口,提供流程啓動服務,運行中流程查詢,運行變量設置和獲取。
TaskService:用戶任務接口(UserTask),提供運行時任務查詢、認領、完成、刪除及變量設置用戶管理等服務。
IdentityService:用戶和組管理接口。
ManagementService:流程引擎管理接口。
HistoryService:流程處理查詢接口,包括執行中流程查詢和歷史流程查詢。
Activiti 的使用
流程定義:
流程圖以下:
流程定義以下:
<definitions id="definitions"
targetNamespace="http://activiti.org/bpmn20"
xmlns:activiti="http://activiti.org/bpmn"
xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL">
<process id="financialReport" name="Monthly financial report reminder process">
<startEvent id="theStart" />
<sequenceFlow id='flow1' sourceRef='theStart' targetRef='writeReportT ask' />
<userT ask id="writeReportT ask" name="Write monthly financial report" >
<documentation>
Write monthly financial report for publication to shareholders.
</documentation>
<potentialOwner>
<resourceAssignmentExpression>
<formalExpression>accountancy</formalExpression>
</resourceAssignmentExpression>
</potentialOwner>
</userT ask>
<sequenceFlow id='flow2' sourceRef='writeReportT ask' targetRef='verifyReportT ask'/>
<userT ask id="verifyReportT ask" name="Verify monthly financial report" >
<documentation>
Verify monthly financial report composed by the accountancy department.
Thisfinancial report is going to be sent toall the company shareholders.
</documentation>
<potentialOwner>
<resourceAssignmentExpression>
<formalExpression>management</formalExpression>
</resourceAssignmentExpression>
</potentialOwner>
</userT ask>
<sequenceFlow id='flow3' sourceRef='verifyReportT ask' targetRef='theEnd'/>
<endEvent id="theEnd" />
</process>
</definitions>
配置文件
默認文件名稱:activiti.cfg.xml,放在 classpath 下。
內容以下:
<beansxmlns="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_DELA Y=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="mailServerHost" value="mail.my-corp.com"/>
<property name="mailServerPort"value="5025" />
</bean>
</beans>
結合 Spring
Spring 中定義數據鏈接及事務管理
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName"value="com.mysql.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://localhost:3306/boss?autoReconnect=true&characterEncoding=UTF-8&characterSe
tResults=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value=""/>
</bean>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
定義 Activiti 配置
<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
<property name="dataSource" ref="dataSource" />
<property name="transactionManager" ref="transactionManager" />
<property name="databaseSchemaUpdate" value="true"/>
<property name="jobExecutorActivate"value="false" />
<property name="mailServerHost" value="mail.xxxx.com"/>
<property name="mailServerPort" value="25" />
<property name="mailServerDefaultFrom"value="hrj@xxxx.com"/>
<property name="mailServerUsername"value="xxxx" />
<property name="mailServerPassword"value="xxxx" />
</bean>
定義流程引擎
<bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
<property name="processEngineConfiguration" ref="processEngineConfiguration"/>
</bean>
定義流程中使用的對象
<bean id="myServiceTask" class="hrj.activiti.MyServiceTask">
<property name="processEngine" ref="processEngine" />
</bean>
<bean id="myActivityBehavior" class="hrj.activiti.MyActivityBehavior">
<property name="processEngine" ref="processEngine" />
</bean>
<bean id="myExecutionListener" class="hrj.activiti.MyExecutionListener">
</bean>
<bean id="valueBean" class="hrj.activiti. ValueBean">
<property name="value"value="張三李四" />
</bean>
建立流程引擎:
1. 根據默認的配置文件建立默認的流程引擎。
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); |
2. 也能夠經過代碼由ProcessEngineConfiguration建立一個流程引擎,這種方式不須要配置文件,能夠在ProcessEngineConfiguration中設置文件中的全部參數。
ProcessEngine processEngine = ProcessEngineConfiguration .createProcessEngineConfigurationFromResourceDefault() .setMailServerHost("gmail.com") .setJdbcUsername("mickey") .setJdbcPassword("mouse") .buildProcessEngine(); |
3. 由Spring建立流程引擎。
部署流程:
public void deployFlow() throws Exception{ //一、建立核心流程引擎對象ProcessEngine ProcessEngine processEngine= ProcessEngines.getDefaultProcessEngine(); //二、使用ProcessEngine獲取須要的服務對象 RepositoryService repositoryService= processEngine.getRepositoryService(); //三、使用服務對象相關的方法完成操做 //建立發佈配置對象 DeploymentBuilder builder= repositoryService.createDeployment(); //指定發佈的文件 builder.addClasspathResource("HelloWorld.bpmn").addClasspathResource("HelloWorld.png"); //發佈流程 builder.deploy(); } |
還能夠經過字符串,zip包,inputStream等方式部署流程。
@Test public void deployProcessZIP() throws Exception{ // 建立一個發佈配置對象 DeploymentBuilder deploymentBuilder = repositoryService.createDeployment(); // 添加發布的資源文件(「流程規則文件」 和 「流程圖片」) InputStream in=this.getClass().getResourceAsStream("/leave.zip") ; ZipInputStream zipInputStream = new ZipInputStream(in); deploymentBuilder.addZipInputStream(zipInputStream); //發佈 deploymentBuilder.deploy(); } |
啓動流程:
@Test public void startFlow() throws Exception{ //一、建立核心流程引擎對象ProcessEngine ProcessEngine processEngine= ProcessEngines.getDefaultProcessEngine(); //二、建立運行時服務對象 RuntimeService runtimeService=processEngine.getRuntimeService(); //3.使用服務 runtimeService.startProcessInstanceByKey("myProcess"); } |
啓動流程使用流程定義中的process id = 「myProcess」,能夠綁定一個Sting類型的businessKey和一個Map類型的流程變量集合
查詢任務:
流程定義中,第一個任務是指定 accountancy 角色處理的。
<potentialOwner>
<resourceAssignmentExpression>
<formalExpression>accountancy</formalExpression>
</resourceAssignmentExpression>
</potentialOwner>
取得任務接口
TaskService taskService = processEngine.getTaskService();
查詢流轉到 accountancy 的任務
List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup("accountancy").list();
領取任務:
若是 fozzie 是 accountancy 下的一個用戶
for (Task task : tasks) {
// fozzie 領取任務
taskService.claim(task.getId(), "fozzie");
}
完成任務:
tasks = taskService.createTaskQuery().taskAssignee("fozzie").list();
for (Task task : tasks) {
//完成任務
taskService.complete(task.getId());
}
查詢:
流程部署查詢:
DeploymentQuery deploymentQuery = repositoryService.createDeploymentQuery(); List<Deployment> deploymentList = deploymentQuery .list(); |
流程定義查詢:
ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery(); List<ProcessDefinition> processDefinitionList = processDefinitionQuery .orderByProcessDefinitionId().asc().list(); |
處理中的流程實例查詢:
RuntimeService runtimeService = processEngine.getRuntimeService(); List<ProcessInstance> processInstanceList = runtimeService.createProcessInstanceQuery().list(); |
處理完成的流程實例查詢:
HistoricProcessInstanceQuery historicProcessInstanceQuery = processEngine.getHistoryService() .createHistoricProcessInstanceQuery(); List<HistoricProcessInstance> historicProcessInstanceList = historicProcessInstanceQuery .finished().orderByProcessInstanceStartTime().asc().list(); |
流程處理記錄查詢:
僅獲得流程中的UserTask節點
HistoricTaskInstanceQuery historicTaskInstanceQuery = processEngine.getHistoryService() .createHistoricT askInstanceQuery(); List<HistoricTaskInstance> historicTaskInstanceList = historicT askInstanceQuery .processInstanceId(processInstanceId) .orderByHistoricActivityInstanceStartTime().asc().list(); |
查詢流程中全部節點
HistoricActivityInstanceQuery historicActivityInstanceQuery=processEngine.getHistoryService().createHistoricActivityInstanceQuery(); List<HistoricActivityInstance> historicActivityInstanceList = historicActivityInstanceQuery .processInstanceId(processInstanceId).orderByHistoricActivityInstanceStartTime(). asc().list(); |