Activiti 开源工作流是也;
必要的软件
JDK 6+
Eclipse
BPMN插件( Activiti Designer编辑器)的安装
打开 Help -> Install New Software. 在如下面板中 , 点击 Add 按钮, 然后填入下列字段:
· Name: Activiti BPMN 2.0 designer
· Location: http://activiti.org/designer/update/
Activiti 流程引擎的配置文件是名为:activiti.cfg.xml,注意:这与Spring方式创建流程殷勤是不一样的
ProcessEngineConfiguration
目前可以使用的类:如下:
1. org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration:
单独运行的流程引擎。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="[email protected]"/>
<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{ //1、创建核心流程引擎对象ProcessEngine ProcessEngine processEngine= ProcessEngines.getDefaultProcessEngine(); //2、使用ProcessEngine获取需要的服务对象 RepositoryService repositoryService= processEngine.getRepositoryService(); //3、使用服务对象相关的方法完成操作 //创建发布配置对象 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{ //1、创建核心流程引擎对象ProcessEngine ProcessEngine processEngine= ProcessEngines.getDefaultProcessEngine(); //2、创建运行时服务对象 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(); |