环境:JDK1.8,Eclipse Mars2,activiti-designer-5.18.0
一、eclipse安装activiti5.18插件
1、下载activiti-designer-5.18.0。
2、解压后将jars文件夹下的jar包复制到eclipse 的plugins文件夹
3、eclipse菜单依次操作Help -> Install new software ->add
4、Name 输入Activiti BPMN2.0
5、点击Archive按钮,选择解压后的activiti-designer-5.18.0.zip文件,然后按提示操作即可。
6、查看安装成功,File ->New ->Activiti
7、配置默认生成流程图(png文件),菜单依次操作Window->preference->Activiti->Save Actions,勾选 Create process difinition image…
二、画activiti diagram
1、新建项目MyDemo
2、新建文件夹bpmn,用于存储流程定义(activiti diagram)
3、eclipse菜单依次操作File -> New ->Other->Activiti->Activiti Diagram
4、输入流程图文件名MyProcess
5、依次拖入Start Event ,User Task,User Task,End Event
6、选择Sequnce flow,分别点击Start Event ,User Task完成第一个连接,依次连接。
7、编辑Process,点击空白处,点击Properties即可编辑
8、id用于启动流程,特别要注意。
三、第一个流程程序
1、下载Activiti6.0
2、解压Activiti6.0后将war文件复制到tomcat 的webapps文件夹下,并启动tomcat
3、将tomcat 的webapps\activiti-rest\WEB-INF的lib文件夹复制到项目的src文件夹下
4、将lib文件夹下所有jar包配置到build path
5、在src文件夹下新建文件log4j.properties
log4j.rootCategory=INFO, stdout , R
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyy-MM-dd HH\:mm\:ss }-[apm\:\u65E5\u5FD7] %p %t %c - %m%n
log4j.appender.file.DatePattern='apm'yyyy-MM-dd'.txt'
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=${catalina.home}/logs/apm.log
log4j.appender.R.MaxFileSize=1024KB
log4j.appender.R.MaxBackupIndex=10
log4j.appender.R.Threshold = INFO
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d{yyy-MM-dd HH\:mm\:ss }-[apm\:\u65E5\u5FD7] %p %t %c - %m%n
log4j.logger.org.springframework=INFO
log4j.logger.org.hibernate=INFO
log4j.logger.org.hibernate.ps.PreparedStatementCache=WARN
log4j.logger.com.lagooo.as=INFO
6、在src文件夹下新建文件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 -->
<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" />
</bean>
</beans>
7、新建测试类ActivitiTest
import java.util.HashMap;
import java.util.Map;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.impl.identity.Authentication;
import org.activiti.engine.task.Task;
public class ActivitiTest {
public static void main(String[] args) {
// // 创建流程引擎,获取默认的流程引擎
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 得到流程存储服务
RepositoryService repositoryService = engine.getRepositoryService();
// 得到运行时服务
RuntimeService runtimeService = engine.getRuntimeService();
// 获取流程任务
TaskService taskService = engine.getTaskService();
// 部署流程文件,文件名与第二节第4步一致。流程更新后,需要重新部署流程文件
repositoryService.createDeployment().addClasspathResource("bpmn/MyProcess.bpmn").deploy();
// // 开启流程,流程名与流程定义中一致,第二节第8步。
runtimeService.startProcessInstanceByKey("myProcess","xxx");
// 查询第一个节点的任务并且输出
Task task = taskService.createTaskQuery().singleResult();
System.out.println("第一个任务完成前,当前任务名称:" + task.getName());
//设置请假申请任务的执行人
taskService.setAssignee(task.getId(), "zhuzhu");
Map<String, Object> taskVariables = new HashMap<String, Object>();
taskVariables.put("vacationApproved", "false"); //拒绝了请假
taskVariables.put("managerMotivation", "We have a tight deadline!");
// 完成第一个任务,相当于流程图中的请假申请
taskService.complete(task.getId(),taskVariables);
// 查询第二个节点的任务并且输出
task = taskService.createTaskQuery().singleResult();
System.out.println("第二个任务完成前,当前任务名称:" + task.getName());
taskService.claim(task.getId(), "chenghong");
// 完成第二个任务,相当于流程图中的请假审核(流程结束)
taskService.complete(task.getId());
task = taskService.createTaskQuery().singleResult();
System.out.println("流程结束后,查找任务:" + task);
}
}
四、与spring mvc整合
1、activiti-rest\WEB-INF\lib文件复制到spring 项目的 lib文件夹
2、删除相同jar包的低版本,不删除将导致冲突,项目不能编译通过
3、在sping-bean.xml文件中增加以下配置,注意dataSource为数据库的bean id
<!--Spring流程引擎配置 -->
<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
<property name="dataSource" ref="dataSource" />
<property name="databaseSchemaUpdate" value="false" />
<property name="transactionManager" ref="transactionManager" />
</bean>
<!--Spring流程引擎-->
<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"/>
4、参照spring mvc 的数据库方式操作流程引擎相关服务
五、流程的任务操作说明
1、流程定义中,设置流程的流向条件
2、设置任务变量,控制流程的流向
Map<String, Object> taskVariables = new HashMap<String, Object>();
taskVariables.put("develop_audit", developAudit); // 拒绝了请假
taskService.complete(task.getId(), taskVariables);
3、增加审批意见
String processInstancesId = task.getProcessInstanceId();
Authentication.setAuthenticatedUserId("cmc"); // 添加批注时候的审核人,通常应该从session获取
taskService.addComment(task.getId(), processInstancesId, "it is not bug");
4、Acitivi获取当前任务
Execution execution = runtimeService.createExecutionQuery()// 创建执行对象查询
.processInstanceId(proc_inst_id)// 使用流程实例ID查询
.activityId(act_id)// 当前活动的id,对应bpmn文件中的活动节点的id的属性值
.singleResult();
Task task = taskService.createTaskQuery().executionId(execution.getId()).singleResult();