@author YHC
首先描述一下版本:
activiti:Activiti5.10
mysql:5.5(Activiti有规定最低版本是5.1.11)
mysql驱动:mysql-connector-java-5.1.17-bin.jar
spring:3.1.2(也就是Activiti自带的例子中的jar包)
该示例主要是从Activiti官网的10分钟入门中提取的.
流程图:
对应的XML文件:(FinancialReportProcess.bpmn20.xml)
<?xml version="1.0" encoding="UTF-8" ?>
<definitions id="definitions"
targetNamespace="http://activiti.org/bpmn20"
xmlns:activiti="http://activiti.org/bpmn"
xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"
xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC"
xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI"
xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL">
<!-- 流程信息 begin -->
<process id="financialReport" name="Monthly financial report process">
<startEvent id="theStart" />
<sequenceFlow id="flow1" sourceRef="theStart" targetRef="writeReportTask" />
<userTask id="writeReportTask" name="Write monthly financial report" >
<documentation>
Write monthly financial report for publication to shareholders.
</documentation>
<potentialOwner>
<resourceAssignmentExpression>
<formalExpression>accountancy</formalExpression>
</resourceAssignmentExpression>
</potentialOwner>
</userTask>
<sequenceFlow id="flow2" sourceRef="writeReportTask" targetRef="verifyReportTask" />
<userTask id="verifyReportTask" name="Verify monthly financial report" >
<documentation>
Verify monthly financial report composed by the accountancy department.
This financial report is going to be sent to all the company shareholders.
</documentation>
<potentialOwner>
<resourceAssignmentExpression>
<formalExpression>management</formalExpression>
</resourceAssignmentExpression>
</potentialOwner>
</userTask>
<sequenceFlow id="flow3" sourceRef="verifyReportTask" targetRef="theEnd" />
<endEvent id="theEnd" />
</process>
<!-- 流程信息 end -->
<!-- 下面的代码是Activiti绘制可视化流程图使用的 -->
<bpmndi:BPMNDiagram>
<bpmndi:BPMNPlane bpmnElement="financialReport">
<bpmndi:BPMNShape bpmnElement="theStart">
<omgdc:Bounds height="30.0" width="30.0" x="75.0" y="225.0" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="writeReportTask">
<omgdc:Bounds height="80.0" width="100.0" x="165.0" y="200.0" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="verifyReportTask">
<omgdc:Bounds height="80.0" width="100.0" x="330.0" y="200.0" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="theEnd">
<omgdc:Bounds height="28.0" width="28.0" x="480.0" y="226.0" />
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="flow1">
<omgdi:waypoint x="105.0" y="240.0" />
<omgdi:waypoint x="165.0" y="240.0" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow2">
<omgdi:waypoint x="265.0" y="240.0" />
<omgdi:waypoint x="330.0" y="240.0" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow3">
<omgdi:waypoint x="430.0" y="240.0" />
<omgdi:waypoint x="480.0" y="240.0" />
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>
接下来看以下对应spring和数据库的配置文件:(activiti.cfg.xml)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
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
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<!-- mysql 数据源配置-->
<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="root" />
<property name="password" value="root" />
<property name="defaultAutoCommit" value="true" />
</bean>
<!-- sqlserver
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="net.sourceforge.jtds.jdbc.Driver" />
<property name="url" value="jdbc:jtds:sqlserver://192.168.10.104:1433/activiti" />
<property name="username" value="sa" />
<property name="password" value="xxxxx" />
<property name="defaultAutoCommit" value="true" />
</bean>
-->
<!-- 事物配置 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
<!-- 直接配置
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activiti" />
<property name="jdbcDriver" value="com.mysql.jdbc.Driver" />
<property name="jdbcUsername" value="root" />
<property name="jdbcPassword" value="root" />
<property name="databaseType" value="mysql">
</property> <property name="databaseSchemaUpdate" value="true" />
-->
<!-- sqlserver 对应数据源配置
<property name="databaseType" value="mssql"></property>
<property name="dataSource" ref="dataSource" />
<property name="transactionManager" ref="transactionManager" />
<property name="databaseSchemaUpdate" value="true" />
<property name="jobExecutorActivate" value="false" />
-->
<!--mysql 对应数据源配置-->
<!-- databaseType 不写默认是h2,如果数据库不是h2那么这项是必须的 -->
<property name="databaseType" value="mysql"></property>
<property name="dataSource" ref="dataSource" />
<property name="transactionManager" ref="transactionManager" />
<property name="databaseSchemaUpdate" value="true" />
<property name="jobExecutorActivate" value="false" />
</bean>
<!-- 流程引擎 -->
<bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
<property name="processEngineConfiguration" ref="processEngineConfiguration" />
</bean>
<!-- 相关服务类 -->
<bean id="repositoryService" factory-bean="processEngine"
factory-method="getRepositoryService" />
<bean id="runtimeService" factory-bean="processEngine"
factory-method="getRuntimeService" />
<bean id="taskService" factory-bean="processEngine"
factory-method="getTaskService" />
<bean id="historyService" factory-bean="processEngine"
factory-method="getHistoryService" />
<bean id="managementService" factory-bean="processEngine"
factory-method="getManagementService" />
<!-- 使用注解添加事物 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
<!--
<bean id="printer" class="org.activiti.test.Printer" />
-->
</beans>
所需jar包均是从Activiti提供的Demo中的activiti-spring-examples项目libs-runtime下获取;
在测试的时候没有写junit单元测试,而是直接写的main方法.
package org.activiti.test.financial;
import java.util.List;
import org.activiti.engine.HistoryService;
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.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class FinancialTest {
public static void main(String[] args) {
//在测试的时候没有使用junit
ClassPathXmlApplicationContext applicationContext =
new ClassPathXmlApplicationContext("activiti.cfg.xml");
FinancialTest t=new FinancialTest();
//step 1 部署
//t.deploymentInstance(applicationContext);
//step 2 启动流程实例
//t.startInstance(applicationContext);
//step 3 查询用户任务
//t.queryUserTask(applicationContext);
//step 4 分配任何给user
// t.claimTask(applicationContext);
//step 5 查询个人任务列表
// t.queryPersonalTaskList(applicationContext);
//step 6 完成任务
// t.completePersonalTask(applicationContext);
//step 7 查询历史流程信息
//t.queryHistoryProcessInstance(applicationContext);
}
//部署流程实例
public void deploymentInstance(ClassPathXmlApplicationContext applicationContext){
//获得repositoryService
RepositoryService repositoryService = (RepositoryService) applicationContext.getBean("repositoryService");
//从文件部署流程
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("org/activiti/test/financial/FinancialReportProcess.bpmn20.xml")
.deploy();
}
//启动流程
public void startInstance(ClassPathXmlApplicationContext applicationContext){
//获得 runtimeservice对象
RuntimeService runtimeService = (RuntimeService) applicationContext.getBean("runtimeService");
//启动流程实例 ,注意这里的key是我们流程文件中的<process id="financialReport" ,id属性,在Activiti术语叫key
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("financialReport");
}
//查询组任务
public void queryUserTask(ClassPathXmlApplicationContext applicationContext){
//获得 TaskService 对象
TaskService taskService = (TaskService) applicationContext.getBean("taskService");
//查询任务列表使用组名称
List<Task> tasks02 = taskService.createTaskQuery().taskCandidateGroup("accountancy").list();
for (Task task : tasks02) {
System.out.println(task.getName());
}
}
//分配任务给用户
public void claimTask(ClassPathXmlApplicationContext applicationContext){
//获得TaskService对象
TaskService taskService = (TaskService) applicationContext.getBean("taskService");
//得到组任务,也可以是 management组
List<Task> tasks02 = taskService.createTaskQuery().taskCandidateGroup("accountancy").list();
//任务分配之后这个任务就会从accountancy用户组的任务列表中消失
for (Task task2 : tasks02) {
taskService.claim(task2.getId(), "fozzie");
System.out.println("任务名称:"+task2.getName());
}
//此时查询fozzie人的个人任务列表
List<Task> tasks = taskService.createTaskQuery().taskAssignee("fozzie").list();
for (Task t : tasks) {
System.out.println("已受理任务名称:"+t.getName());
}
}
//查询个人的任务列表
public void queryPersonalTaskList(ClassPathXmlApplicationContext applicationContext){
//获得TaskService对象
TaskService taskService = (TaskService) applicationContext.getBean("taskService");
//查询fozzie用户的个人任务列表
List<Task> tasks = taskService.createTaskQuery().taskAssignee("fozzie").list();
//输出受理任务信息
for (Task t : tasks) {
System.out.println("已受理任务名称:"+t.getName());
}
}
//完成任务
public void completePersonalTask(ClassPathXmlApplicationContext applicationContext){
//获得TaskService对象
TaskService taskService = (TaskService) applicationContext.getBean("taskService");
//查询 fozzie用户个人任务列表并完成其任务
List<Task> tasks = taskService.createTaskQuery().taskAssignee("fozzie").list();
//完成用户任务
for (Task task : tasks) {
System.out.println("完成任务名称:"+task.getName());
//通过任务id完成任务
taskService.complete(task.getId());
}
}
//查询历史流程信息,也许你在查询的时候这个任务没有结束
//那么请你将management组的任务claimTask分配给用户然后completePersonalTask完成任务
//这个流程实例就算完成了,你在这里也才会查询出来,否则流程实例没有到达
public void queryHistoryProcessInstance(ClassPathXmlApplicationContext applicationContext){
//获取historyService
HistoryService historyService = (HistoryService) applicationContext.getBean("historyService");
//在这里需要注意的是,你的financialReport流程如果启动多个,singleResult将会出错
//由于这里是测试我很清除这个实例只启动了一个,所以使用singleResult方法,如果你在测试时候需要注意
HistoricProcessInstance historicProcessInstance =
historyService.createHistoricProcessInstanceQuery().processDefinitionKey("financialReport").singleResult();//processInstanceId("financialReport").singleResult();
System.out.println("流程结束时间: " + historicProcessInstance.getEndTime());
}
}
点击到页面上之后下载这一项:
1.解压文件
2.启动h2数据库,如下图:
3.启动tomcat,如下图
4.打开浏览器输入:http://localhost:8080/activiti-explorer
5.使用下面给出账户登录,如下图
6.部署一个新的流程,如下图操作:(请按照A,B顺序操作)
7.选择文件,如下图:
7.选择以下文件上传,如下图:(在7.1处描述文件位置)
7.1文件位置,如下图:
8.退出切换用户fozzie/fozzie登录
9.打开流程,选择流程,
10.启动此流程,注意:是紧接着上一步的操作:
11.查看任务,如下图
12.接受任务,如下图:
13,查看并完成任务,如下图
14.切换用户,kermit/kermit登陆.
15.查看任务.,如下图:
16.接受任务.如下图:
17.完成任务:如下图
18.确认是否有当前执行流程.来确认流程是否执行完毕.