Activiti5.13安裝入門

1.概述
為了開發一個工作流的項目,先使用了jbpm5.4,結果經過1個月的學習,感覺jbpm存在以下問題:1.配置複雜,文檔較少。2.缺少在實際環境中運行的演示代碼;3.代碼在演示環境中一次運行完成正常,但是在實際運行環境中不可能一次創建對象後完成,每次恢復時代碼就會出現異常,經過長時間的研究,串行流程恢復執行能夠正常,但並行流程恢復執行又出現異常。不得以,換成Activiti試一下。
個人感覺JBPM的代碼還是比較混亂的,離穩定的運行還有很長的路要走。

具體文獻參考官方文獻5.13用户指南《http://www.activiti.org/userguide/index.html#activiti.setup》。
到官方網站下載:activiti-5.11.zip

2.環境要求和基本演示
(1)操作系統環境變量中要配置JAVA_HOME
(2)將activiti-5.13.zip壓縮文件中的activiti-explorer.war 複製到tomcat中的webapps
(3)啓動瀏覽器http://localhost:8080/activiti-explorer,以 kermit/kermit登錄
演示版本中共有三個用户
UserId Password Security roles
kermit kermit admin
gonzo gonzo manager
fozzie fozzie user

(4)下載eclipse_indigo(eclipse3.7),解壓縮運行,indigo版本集成了maven,插件Activiti BPMN 2.0 designer必須安裝在indigo中
(5)運行eclipse,安裝Activiti BPMN 2.0 designer插件,具體參見:http://www.ecmkit.com/zh-hans/2012/03/21/activiti-workflow-hell
Help -> Install New Software,輸入以下站點信息:
Name: Activiti BPMN 2.0 designer
Location: http://activiti.org/designer/update/

3.數據庫配置為oracle
(1)將database->create目錄中對應的sql語句複製到數據庫中執行即可
我的是oracle11g,結果出現了“A-01460: 轉換請求無法實現或不合理”問題,將驅動轉換成ojdbc6.jar,還要在環境變量classpath中配置一下

4.相關jar包
(1)在eclipse中新建一個Web Project
(2)將activiti-5.11中lib目錄下所有jar包複製到web-inf\lib\
(3)複製activation-1.1.jar;commons-dbcp-1.4.jar;commons-email-1.2.jar;commons-lang3-3.1.jar;commons-logging.jar;commons-pool-1.5.4.jar;mail-1.4.1.jar
spring 3.1所有jar包,數據庫jar包
(4)相關jar包如果沒有,可以到這個去下http://yiyiboy2010.iteye.com/blog/1530924

4.演示代碼
(1)新建一個bpmn
可以自己新建,也可以用http://yiyiboy2010.iteye.com/blog/1530924裏的Interview.bpmn20.xml,將名字改成Interview.bpmn,放在根目錄下
注意:從activti5.10開始,bpmn20.xml後綴都改成了bpmn,如果需要圖片,自己從eclipse中導出
(2)在根目錄下新建一個數據庫配置文件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"
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="databaseSchemaUpdate" value="true" />
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/webauth?useUnicode=true&characterEncoding=utf-8" />
<property name="jdbcDriver" value="com.mysql.jdbc.Driver" />
<property name="jdbcUsername" value="root" />
<property name="jdbcPassword" value="" />
<property name="jobExecutorActivate" value="true" />
</bean>
<!--
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<property name="databaseSchemaUpdate" value="true" />
<property name="jdbcUrl" value="jdbc:oracle:thin:@192.108.119.45:1521:test" />
<property name="jdbcDriver" value="oracle.jdbc.driver.OracleDriver" />
<property name="jdbcUsername" value="username" />
<property name="jdbcPassword" value="password" />
<property name="jobExecutorActivate" value="true" />
</bean>
-->
</beans>

(3)新建一個java測試類

點擊(此處)摺疊或打開

import java.util.List;

import org.activiti.engine.HistoryService;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.task.Task;

public class Test {

//本流程模擬的是某公司2012年實習生招聘流程
//張三來參加該招聘流程,公司相關負責人負責處理流程
public static void main(String[] args) {
//加載配置文件
ProcessEngine processEngine = ProcessEngineConfiguration
.createProcessEngineConfigurationFromResource("activiti.cfg.xml")
.buildProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
RuntimeService runtimeService = processEngine.getRuntimeService();
repositoryService.createDeployment()
.addClasspathResource("Interview.bpmn")
.deploy();
String processId = runtimeService.startProcessInstanceByKey("Interview").getId();

TaskService taskService = processEngine.getTaskService();
HistoryService historyService = processEngine.getHistoryService();
//得到筆試的流程
System.out.println("***************筆試流程開始***************");
List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup("人力資源部").list();
for (Task task : tasks) {
System.out.println("人力資源部的任務:name:"+task.getName()+",id:"+task.getId());
taskService.claim(task.getId(), "張三");

}
System.out.println("張三的任務數量:"+taskService.createTaskQuery().taskAssignee("張三").count());
tasks = taskService.createTaskQuery().taskAssignee("張三").list();
for (Task task : tasks) {
System.out.println("張三的任務:name:"+task.getName()+",id:"+task.getId());
taskService.complete(task.getId());
}
System.out.println("張三的任務數量:"+taskService.createTaskQuery().taskAssignee("張三").count());
System.out.println("***************筆試流程結束***************");

System.out.println("***************一面流程開始***************");
tasks = taskService.createTaskQuery().taskCandidateGroup("技術部").list();
for (Task task : tasks) {
System.out.println("技術部的任務:name:"+task.getName()+",id:"+task.getId());
taskService.claim(task.getId(), "李四");
}
System.out.println("李四的任務數量:"+taskService.createTaskQuery().taskAssignee("李四").count());
for (Task task : tasks) {
System.out.println("李四的任務:name:"+task.getName()+",id:"+task.getId());
taskService.complete(task.getId());
}
System.out.println("李四的任務數量:"+taskService.createTaskQuery().taskAssignee("李四").count());
System.out.println("***************一面流程結束***************");

System.out.println("***************二面流程開始***************");
tasks = taskService.createTaskQuery().taskCandidateGroup("技術部").list();
for (Task task : tasks) {
System.out.println("技術部的任務:name:"+task.getName()+",id:"+task.getId());
taskService.claim(task.getId(), "李四");
}
System.out.println("李四的任務數量:"+taskService.createTaskQuery().taskAssignee("李四").count());
for (Task task : tasks) {
System.out.println("李四的任務:name:"+task.getName()+",id:"+task.getId());
taskService.complete(task.getId());
}
System.out.println("李四的任務數量:"+taskService.createTaskQuery().taskAssignee("李四").count());
System.out.println("***************二面流程結束***************");

System.out.println("***************HR面流程開始***************");
tasks = taskService.createTaskQuery().taskCandidateGroup("人力資源部").list();
for (Task task : tasks) {
System.out.println("技術部的任務:name:"+task.getName()+",id:"+task.getId());
taskService.claim(task.getId(), "李四");
}
System.out.println("李四的任務數量:"+taskService.createTaskQuery().taskAssignee("李四").count());
for (Task task : tasks) {
System.out.println("李四的任務:name:"+task.getName()+",id:"+task.getId());
taskService.complete(task.getId());
}
System.out.println("李四的任務數量:"+taskService.createTaskQuery().taskAssignee("李四").count());
System.out.println("***************HR面流程結束***************");

System.out.println("***************錄用流程開始***************");
tasks = taskService.createTaskQuery().taskCandidateGroup("人力資源部").list();
for (Task task : tasks) {
System.out.println("技術部的任務:name:"+task.getName()+",id:"+task.getId());
taskService.claim(task.getId(), "李四");
}
System.out.println("李四的任務數量:"+taskService.createTaskQuery().taskAssignee("李四").count());
for (Task task : tasks) {
System.out.println("李四的任務:name:"+task.getName()+",id:"+task.getId());
taskService.complete(task.getId());
}
System.out.println("李四的任務數量:"+taskService.createTaskQuery().taskAssignee("李四").count());
System.out.println("***************錄用流程結束***************");


HistoricProcessInstance historicProcessInstance = historyService
.createHistoricProcessInstanceQuery()
.processInstanceId(processId).singleResult();
System.out.println("流程結束時間:"+historicProcessInstance.getEndTime());
System.exit(0);
}
}

運行結果為

點擊(此處)摺疊或打開

***************筆試流程開始***************
人力資源部的任務:name:筆試,id:8
張三的任務數量:1
張三的任務:name:筆試,id:8
張三的任務數量:0
***************筆試流程結束***************
***************一面流程開始***************
技術部的任務:name:技術一面,id:11
李四的任務數量:1
李四的任務:name:技術一面,id:11
李四的任務數量:0
***************一面流程結束***************
***************二面流程開始***************
技術部的任務:name:技術二面,id:14
李四的任務數量:1
李四的任務:name:技術二面,id:14
李四的任務數量:0
***************二面流程結束***************
***************HR面流程開始***************
技術部的任務:name:HR面,id:17
李四的任務數量:1
李四的任務:name:HR面,id:17
李四的任務數量:0
***************HR面流程結束***************
***************錄用流程開始***************
技術部的任務:name:錄用,發放Offer,id:20
李四的任務數量:1
李四的任務:name:錄用,發放Offer,id:20
李四的任務數量:0
***************錄用流程結束***************
流程結束時間:Wed Jul 31 16:35:45 CST 2013


參考文獻
1.activiti學習筆記2. http://yiyiboy2010.iteye.com/blog/1530924