> 文章列表 > Activity工作流(一):环境搭建

Activity工作流(一):环境搭建

Activity工作流(一):环境搭建

1. 环境搭建

开发环境: activiti 5.22.0 jdk 1.8 mysql 5.6 tomcat 8.5

注意,activiti需要在数据库里创建表,可以在官网下载源码安装包,里面有数据库的表。或者通过java代码自动创建表。所以1.1和1.2节中的方法二选一即可。

1.1 下载源码包

https://www.activiti.org/download-links
在这里插入图片描述

本教程使用的是5.22.0版本,解压后如下:
Activity工作流(一):环境搭建

在database\\create文件夹下有各种版本数据库使用的创建数据库的sql语句。5.22.0版本里有25张基础表。此处使用mysql5.6数据库,新建一个数据库,运行如下文件
Activity工作流(一):环境搭建

运行后得到25张表:

Activity工作流(一):环境搭建

数据库表说明:
Activity工作流(一):环境搭建

1.2 通过java代码创建表

引入依赖的jar

<dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><dependency><groupId>org.activiti</groupId><artifactId>activiti-bpmn-converter</artifactId><version>5.22.0</version></dependency><dependency><groupId>org.activiti</groupId><artifactId>activiti-bpmn-model</artifactId><version>5.22.0</version></dependency><dependency><groupId>org.activiti</groupId><artifactId>activiti-image-generator</artifactId><version>5.22.0</version></dependency><dependency><groupId>org.activiti</groupId><artifactId>activiti-process-validation</artifactId><version>5.22.0</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.6.1</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.6.1</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.44</version></dependency><dependency><groupId>commons-dbcp</groupId><artifactId>commons-dbcp</artifactId><version>1.4</version></dependency><dependency><groupId>org.activiti</groupId><artifactId>activiti-root</artifactId><version>5.22.0</version></dependency><dependency><groupId>org.activiti</groupId><artifactId>activiti-spring</artifactId><version>5.22.0</version></dependency>
</dependencies>

在resources目录下创建activiti.cfg.xml,配置数据源和默认引擎

<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/activiti2?characterEncoding=utf-8" /><property name="username" value="root" /><property name="password" value="" />
</bean><bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration"><property name="dataSource" ref="dataSource" /><property name="databaseSchemaUpdate" value="true" />
</bean>

其中databaseSchemaUpdate属性允许在进程引擎启动和关闭时设置策略来处理数据库模式。

  1. false
    (默认):当创建流程引擎时,检查数据库模式对库的版本,如果版本不匹配则抛出异常。
  2. true:在构建流程引擎时,执行检查,如果需要,执行模式的更新。如果模式不存在,则创建它。
  3. create-drop:在创建流程引擎时创建模式,并在流程引擎关闭时删除模式。 这里设置成true,运行程序的时候自动生成表。
    activiti底层使用的是mybtais,可以通过log4j查看执行的语句:
#For all other servers: Comment out the Log4J listener in web.xml to activate Log4J.
log4j.rootLogger=DEBUG, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
#begin
#for normal test,delete when online
log4j.logger.com.ibatis=DEBUG
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG

测试代码:

@Test
public void createTable() {ProcessEngineConfiguration configuration =ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml");//ProcessEngines.getDefaultProcessEngine();ProcessEngine processEngine = configuration.buildProcessEngine();System.out.println(processEngine);
}

1.3 idea安装activiti插件

File->Settings->Plugins 搜索actiBPM,右侧选择Install,安装成功后重启Idea。

Activity工作流(一):环境搭建

在工程中可以创建 bpmn文件了。bpmn规范会在后续课程中讲解。

Activity工作流(一):环境搭建

Activity工作流(一):环境搭建

idea中绘制流程图的时候中文会乱码,在idea安装路径的bin目录下修改配置文件:
Activity工作流(一):环境搭建

在文件末尾加一句,如图:-Dfile.encoding=UTF-8
Activity工作流(一):环境搭建

1.4 示例工程

绘制流程图leave.bpmn:ZhangSan发起请假,LiSi审批请假

部署任务:

@Test
public void addDeployment() {Deployment deployment = processEngine.getRepositoryService() // 与流程定义和部署对象相关的Service.createDeployment() // 创建一个部署对象.name("请假流程") // 设置对应流程的名称.addClasspathResource("leave.bpmn") .deploy(); // 完成部署
}

数据库里已经插入了对应的数据

启动任务:
@Test
public void startProcess() {RuntimeService runtimeService = processEngine.getRuntimeService();//key是act_re_procdef中的KEY_,bpmn的idruntimeService.startProcessInstanceByKey("myProcess_1");
}

查看ZhangSan的任务并提交给下一个操作者。查看李四的任务并处理。(act_ru_task表)

@Test
public void queryZhangSanTask() {String assignee = "ZhangSan";List<Task> taskList = processEngine.getTaskService()//获取任务service.createTaskQuery()//创建查询对象.taskAssignee(assignee)//指定查询人.list();for (Task task : taskList) {System.out.println("代办任务ID:" + task.getId());System.out.println("代办任务name:" + task.getName());System.out.println("代办任务创建时间:" + task.getCreateTime());System.out.println("代办任务办理人:" + task.getAssignee());System.out.println("流程实例ID:" + task.getProcessInstanceId());System.out.println("执行对象ID:" + task.getExecutionId());//提交任务到下一个代理人engine.getTaskService().complete(task.getId());}
}
@Test
public void queryLiSiTask() {String assignee = "LiSi";List<Task> taskList = processEngine.getTaskService()//获取任务service.createTaskQuery()//创建查询对象.taskAssignee(assignee)//指定查询人.list();for (Task task : taskList) {System.out.println("代办任务ID:" + task.getId());System.out.println("代办任务name:" + task.getName());System.out.println("代办任务创建时间:" + task.getCreateTime());System.out.println("代办任务办理人:" + task.getAssignee());System.out.println("流程实例ID:" + task.getProcessInstanceId());System.out.println("执行对象ID:" + task.getExecutionId());processEngine.getTaskService().complete(task.getId());}
}

查看执行历史act_hi_taskinst表:

@Test
public void viewHistory() {HistoryService historyService = processEngine.getHistoryService();HistoricProcessInstance historicProcessInstance =historyService.createHistoricProcessInstanceQuery().processInstanceId("15001").singleResult();System.out.println("开始时间:" + historicProcessInstance.getStartTime());System.out.println("结束时间:" + historicProcessInstance.getEndTime());
}