今天看到公司有一个项目,是关于activity工作流的,第一次接触,记录一下,方便巩固和之后的查询。
1.配置maven环境
2.运行测试代码
3.代码实现activity工作流
1.配置maven环境
activity是一个比较简单容易上手的工作流,主要操作分为一下步骤
- 利用activity插件画出需要的逻辑流程图
- 部署流程
- 启动流程
- 迭代处理流程
- 流程结束
(1)安装所需的画图插件(有在线安装和离线安装,建议是离线安装)
离线通过安装包来安装
下载链接:https://pan.baidu.com/s/1jZgTImyDFsQ62ttt5CyQKg,提取码:abw0
解压后,将 对应的plugins中j所有ar包(我的解压路径是:D:activityWorkFlowActivitiDesignerplugins)复制到maven工具的安装目录()下,然后删除configuration文件下的org.eclipse.update整个文件(不删掉的话,会报错的)
然后在 maven工具中选择help - install new software
点击进来后,选择 add - local… 选择画图插件解压后的位置,如下图:
验证是否安装成功,在maven工具中,点击 file - new - other...中 搜索activiti 如果出现 activiti diagram 和activiti project 两个文件 ,说明已经安装成功了。
2.运行测试代码
1.在maven工具中,新建一个maven工程
2.在pom.xml配置文件中导入需要依赖的jar包,以mysql数据库为例
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>mavenPro</groupId> <artifactId>activityWordFlow</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>activityWordFlow</name> <url>http://maven.apache.org</url> <properties> </properties> <dependencies> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-engine</artifactId> <version>6.0.0</version> </dependency> <!-- https://mvnrepository.com/artifact/org.activiti/activiti-spring --> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring</artifactId> <version>6.0.0</version> </dependency> <!-- https://mvnrepository.com/artifact/org.codehaus.groovy/groovy-all --> <dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy-all</artifactId> <version>2.5.7</version> <type>pom</type> </dependency> <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.25</version> </dependency> <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-jdk14 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-jdk14</artifactId> <version>1.7.25</version> <scope>test</scope> </dependency> <!-- https://mvnrepository.com/artifact/junit/junit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.17</version> </dependency> </dependencies> </project>
注意:如果版本不对引起的报错,可以百度“maven中央仓库”,在里面找到对应依赖的jar包,复制粘贴,替换即可。
3.然后新建一个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.StandaloneInMemProcessEngineConfiguration"> <property name="databaseSchemaUpdate" value="true"/> <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="qwer1234" /> </bean> </beans>
4.新建一个java类,用来在msql数据库中创建表
package activityWordFlow; import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngineConfiguration; public class CreateTable { public static void main(String[] args) { ProcessEngine processEngine = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml").buildProcessEngine(); System.out.println("processEngine="+processEngine); } }
其中:是根据第3步的配置文件名称(activiti.cfg.xml),运行后,查看数据库,就会出现28张表,如下图:
5. 先把properties界面展示出来,方便之后使用。
6.以简单报销流程为例,在maven工具中,利用画图插件新建一个baoxiao.bpmn,如图:
7.在界面上palette(画板)中,把StartEvent节点拖出来即可,然后选择 new user task,新增一个用户,依次添加报销人、经理审批、财务审批和结束节点(EndEvent),添加完成后,如下图:
在该流程中的各个环节 ,配置属性 报销人---employee、经理审批---manager、财务审批 --- account,保存一下该流程
注:如果保存成功了,会有同名的.png图片生成,本例子中是baoxiao.png,如图:
如果没有生成的话,请在Window - preferences - save action 中,勾选 create process ...这一选项。
到第七步完成后,一个简单报销的activity工作流已经建好了,接下来就是要通过代码来实现该工作流。
3.代码实现activity工作流
package activityWordFlow; import java.util.List; import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.activiti.engine.RuntimeService; import org.activiti.engine.repository.Deployment; import org.activiti.engine.runtime.ProcessInstance; import org.activiti.engine.task.Task; public class run { /** * 部署流程 * 执行完,就会像act_re_procdef、act_re_deployment和act_ge_bytearray三张表中,插入数据 */ private static ProcessEngine processEngine =ProcessEngines.getDefaultProcessEngine(); public void delployFlow(){ Deployment deployment = processEngine.getRepositoryService()//与流程定义和部署对象相关的service .createDeployment()//创建一个部署对象 .name("报销流程") //添加部署对象名称 .addClasspathResource("baoxiao.bpmn")//从classpath的资源加载,一次只能加载一个文件 .addClasspathResource("baoxiao.png")//从classpath的资源加载,一次只能加载一个文件 .deploy();//完成部署 // 存在在数据库 act_re_procdef的DEPLOYMENT_ID_ //act_re_procdef(流程定义数据表) act_re_deployment (部署信息表) act_ge_bytearray(资源文件表) System.out.println(deployment.getId()); System.out.println(deployment.getName()); } /** * 启动流程 runtimeService对象 * 执行完,就会在 act.ru.task表中,插入数据(每次插入一条数据) */ public void flowStart() { RuntimeService runtimeService = processEngine.getRuntimeService();// 获取runtimeService对象 ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("员工报销单据");//act_re_procdef(流程定义数据表)中的key_字段 } /** * 查找代办任务信息 */ public void findEmployeeTask(){ //数据库关系》》》》ID【act_re_deployment】 == ID【act_ru_execution】 == ID【act_ru_task】 ==》【ASSIGNEE_(cwh)】 String assignee = "employee"; //节点的assignee_ List<Task> taskList= processEngine.getTaskService()//获取任务启动流程的service .createTaskQuery()//创建查询对象 .taskAssignee(assignee)//指定查询人 .list(); if(taskList.size()>0){ 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()); } } } /** * 处理流程 * * 根据act_ru_task 任务表的id,获取流程的service对象,调用complete方法来处理流程。 * * @Description: */ public void completeTask(){ // ID【act_ru_task】 String taskId = "2505"; processEngine.getTaskService().complete(taskId);//完成任务 System.out.println("完成任务,任务ID:"+taskId); } public static void main(String[] args) { run r = new run(); //r.delployFlow(); //r.flowStart(); r.findEmployeeTask(); //r.completeTask(); } }