大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全家桶1年46,售后保障稳定
1、介绍
几乎任何一个公司的软件开发都会涉及到流程,以往我们可能是这么实现的:业务表添加标志位标识流程的节点状态,关联批注表实现审核意见,根据一些业务数据分析处理逻辑,分配任务到用户,节点的调度,审批等…..这其实是很繁琐的,且不说开发起来比较混乱,维护起来更是难上加难:
Activiti刚好就能解决几乎所有的这些问题,当流程开发变得简单有趣。
官方文档:https://www.activiti.org/userguide/
Activiti项目是一项新的基于Apache许可的开源BPM平台,从基础开始构建,旨在提供支持新的BPMN 2.0标准,包括支持对象管理组(OMG),面对新技术的机遇,诸如互操作性和云架构,提供技术实现。
作为开发者,使用Activiti带给我的直接好处:
- 天然支持Spring(Spring需要在配置文件中自己定义Activiti的Bean,Spring Boot则不需要)
- 流程定义通过画流程图实现(官方提供了相关工具,Eclipse也有插件支持),简单直观,易维护,易修改。
- 审批条件参数化,流程分支简单实现。
- 审批人可使用多种方式设置(支持用户、用户组、角色、候选组以及监听器动态设置),灵活,简单。
- 统一的审批接口,并不需要判断流程当前节点和走向。
- 提供强大的JPA查询,同时支持Name Query和Native Query。
- 流程数据与业务数据分离。
后续文章会一步步介绍Activiti的功能,主要使用基于Spring Boot的工程,也会提供单纯的Spring工程Demo。
2、示例
此处演示一个小示例,暂不解释代码,仅仅看看是怎样用activiti实现的。
场景就是请假,不过这里稍稍多了点内容,就是请假由请假人对应部门的领导审批,而不是统一的某一部分人。
2.1、使用Spring Boot工程
首先创建Spring boot工程,为了演示方便,使用内存数据库,完整pom文件如下:
2.2、流程定义
这里使用eclipse的activiti designer插件,插件安装方法另见:Eclipse安装Activiti Designer插件
如我所愿,这里以请假流程,使用流程设计器得到如下流程定义:
这个流程相当简单。下面是定义的xml文件:
里面包含一个用户任务、一个流程监听器(流程结束后回写业务数据状态)、一个任务监听器(以为审批是由申请员工对应部门的领导审核的,使用监听器可以灵活的设置任务审批候选人)。
2.3、监听器
监听器分任务监听器和流程监听器。
任务监听器
/**
* 领导审核监听器
* @author anxpp.com
* 2016年12月24日 下午12:10:01
*/
public class LeaderCheckListener implements TaskListener{
private static final long serialVersionUID = 4285398130708457006L;
private final static Logger log = LoggerFactory.getLogger(LeaderCheckListener.class);
@Override
public void notify(DelegateTask task) {
log.info("领导审核监听器...");
//设置任务处理候选人
UserService userService = SpringUtil.getBean(UserService.class);
List<String> leaders = userService.getSimpleCheckerByDept(Long.valueOf(task.getVariable("dept").toString()));
log.info(leaders.toString());
log.info(task.getVariable("dept").toString());
task.addCandidateUsers(leaders);
}
}
流程监听器(此处并无实际代码,只给写法):
/**
* 流程监听器
* @author anxpp.com
* 2016年12月24日 下午12:33:58
*/
public class SimpleProcessEndListener implements ExecutionListener{
private static final long serialVersionUID = 5212042435691138021L;
private final static Logger log = LoggerFactory.getLogger(SimpleProcessEndListener.class);
@Override
public void notify(DelegateExecution arg0) throws Exception {
log.info("流程结束监听器...");
//TODO 修改业务数据状态
}
}
单元测试
package com.anxpp.demo.activiti;
import java.util.Iterator;
import java.util.List;
import org.activiti.engine.task.Task;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import com.anxpp.demo.activiti.core.entity.User;
import com.anxpp.demo.activiti.core.service.UserService;
import com.anxpp.demo.activiti.simple.Config.Constant;
import com.anxpp.demo.activiti.simple.core.entity.ApplySimple;
import com.anxpp.demo.activiti.simple.core.service.ApplySimpleService;
@RunWith(SpringRunner.class)
@SpringBootTest
public class ActivitiDemoApplicationTests {
private final static Logger log = LoggerFactory.getLogger(ActivitiDemoApplicationTests.class);
private static Long DEPT_TINY_SOFTWARE_STUDIO = 1L;
private static Long DEPT_OTHER = 2L;
@Autowired
UserService userService;
@Autowired
ApplySimpleService simpleService;
/**
* 测试程序启动
*/
@Test
public void contextLoads() {
}
/**
* 测试数据库操作
*/
@Test
public void testCURD(){
Long countUser = userService.countUser();
User user = new User();
user.setName("anxpp0");
user.setDept(DEPT_TINY_SOFTWARE_STUDIO);
userService.save(user);
Assert.assertEquals(new Long(countUser+1), userService.countUser());
}
/**
* 测试简单流程
*/
@Test
public void testSimpleActiviti(){
long startAt = System.currentTimeMillis();
//添加申请用户
User user = new User();
user.setName("anxpp");
user.setDept(DEPT_TINY_SOFTWARE_STUDIO);
user.setPosition(Constant.POSITION_GENERAL);
userService.save(user);
//添加审核用户
User userLeader1 = new User();
userLeader1.setName("anxpp1");
userLeader1.setDept(DEPT_TINY_SOFTWARE_STUDIO);
userLeader1.setPosition(Constant.POSITION_LEADER);
userService.save(userLeader1);
User userLeader2 = new User();
userLeader2.setName("anxpp2");
userLeader2.setDept(DEPT_OTHER);
userLeader2.setPosition(Constant.POSITION_LEADER);
userService.save(userLeader2);
Long countHis = simpleService.countProcess();
Long countLeader1Task = simpleService.countTask(userLeader1.getId());
Long countLeader2Task = simpleService.countTask(userLeader2.getId());
//创建请假申请
ApplySimple applySimple = new ApplySimple();
applySimple.setInsertBy(user.getId());
applySimple.setComtent("有事请假...");
//启动请假流程
simpleService.startProcess(applySimple);
/**断言历史流程+1*/
Assert.assertEquals(simpleService.countProcess(), new Long(countHis+1));
/**断言领导任务变化*/
Assert.assertEquals(simpleService.countTask(userLeader1.getId()), new Long(countLeader1Task+1));
Assert.assertEquals(countLeader2Task, simpleService.countTask(userLeader2.getId()));
//获取用户任务
List<Task> taskUserLeader1 = simpleService.getTaskByUid(userLeader1.getId());
//处理任务
Iterator<Task> iterator = taskUserLeader1.iterator();
while(iterator.hasNext()){
Task task = iterator.next();
/**断言任务节点名称*/
Assert.assertEquals("领导审批", task.getName());
simpleService.completeSimpleCheck(task.getId(), ApplySimpleService.STATE_PASS);
}
/**断言领导任务变化*/
Assert.assertEquals(countLeader1Task, simpleService.countTask(userLeader1.getId()));
Assert.assertEquals(countLeader2Task, simpleService.countTask(userLeader2.getId()));
System.err.println("asdf");
log.info("测试完成,花费时间:"+(System.currentTimeMillis()-startAt));
}
}
运行单元测试,OK!通过!
完整实例源码地址:https://github.com/anxpp/activitiSimpleDemo.git
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/215504.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...