网站首页 > java教程 正文
一、Activiti简介
Activiti5是由Alfresco软件在2010年5月17日发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。Activiti基于Apache许可的开源BPM平台,创始人Tom Baeyens是JBoss jBPM的项目架构师,它特色是提供了eclipse插件,开发人员可以通过插件直接绘画出业务 流程图。.
二、Activiti插件安装
关于activiti建议在eclipse下安装相关插件,idea下安装的actiBPMN有很多问题,界面也不是很友好。
下图是eclipse下绘制的一个流程图:
一个简单的工作流包括开始节点,流程节点和结束节点。
三、SpringBoot集成Activiti
这里我们用的是activiti6.0版本,主要需要如下包:
<dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring-boot-starter-basic</artifactId> <version>6.0.0</version> </dependency> <!--mysql驱动--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.29</version> </dependency>
application.yml主要配置如下:
server: port: 8801 spring: datasource: url: jdbc:mysql://10.168.xx.xx:8106/uaf_activiti?Unicode=true&characterEncoding=UTF-8 username: root password: xxxxx activiti: database-schema-update: true check-process-definitions: false
以上为基本配置,完成上述配置后我们启动activiti服务系统会自动初始表到我们mysql库。
四、监听方式配置Activiti流程
我们一般配置activiti流程的时候代理人都是写死的方式,这样若修改代理人时需要重新部署流程。
activiti也支持灵活的方式配置代理人,主要有两种方式:
- 动态参数方式。
- 监听方式。
这里我们介绍监听方式,配置监听方式首先我们需要定义activiti的监听类:
public class ActProcessListener implements TaskListener { /**流程监听成员变量*/ private FixedValue processCode; @Override public void notify(DelegateTask delegateTask) { //TODO 新建流程节点与审批用户/角色关联表,实现流程动态监听 String process = String.valueOf(processCode.getValue(delegateTask)); MySlf4j.textInfo("进入{0}流程节点监听.....", process); if ("leaveApply".equals(process)) { delegateTask.addCandidateUser("will"); } else if ("deptManagerAppr".equals(process)) { delegateTask.addCandidateUser("deman"); } else if ("hrClerkAppr".equals(process)) { delegateTask.addCandidateUser("petty"); } else if ("hrManagerAppr".equals(process)) { delegateTask.addCandidateUser("may"); } } }
通过监听方式,流程可以自动判断下一节点的受理人,我们也可以将监听配置放到数据库管理,实现真正意义上的动态配置。
工作流需要管理相应的监听类,并指定监听成员变量。如下图:
五、工作流引擎执行
工作流程引擎一般包括如下步骤:
相关接口代码如下:
/**部署流程*/ ActProcessRespVo deployProcess(ActProcessReqVo actProcessReqVo); /**启动流程*/ ActWorkflowRespVo startWorkflow(ActWorkflowReqVo<LabelInfo> actWorkflowReqVo); /**签收任务*/ boolean claimTask(ActClaimTaskReqVo actClaimTaskReqVo); /**提交任务*/ boolean completeTask(ActCompleteTaskReqVo<LabelInfo> actCompleteTaskReqVo); /**查询任务是否已签收*/ boolean checkClaimTask(ActClaimTaskReqVo actClaimTaskReqVo); /**释放任务*/ boolean releaseTask(String taskId); /**查询待办任务*/ ActProcessTaskRespVo queryTodoTasks(ActProcessTaskReqVo actProcessTaskReqVo);
测试类代码如下:
@SpringBootTest(classes = ActivitiApplication.class) @RunWith(SpringRunner.class) public class ActivitiProcessTest { @Autowired private IActivitiService activitiService; @Autowired private IWorkflowService workflowService; /**流程文件路径*/ static String filePath = System.getProperty("user.dir") + "/src/main/resources/processes/leaveProcess.bpmn"; /**流程部署*/ @Test public void testDeployProcess() throws IOException { byte[] b = Files.readAllBytes(Paths.get(filePath)); ActProcessReqVo actProcessReqVo = new ActProcessReqVo(); actProcessReqVo.setProcessId("leaveProcess"); actProcessReqVo.setProcessName("请假流程"); actProcessReqVo.setProcessFileType("bpmn"); actProcessReqVo.setProcessBase64Str(Base64Utils.encode(b)); activitiService.deployProcess(actProcessReqVo); } /**启动流程*/ @Test public void testStartWorkflow() { ActWorkflowReqVo<LabelInfo> actWorkflowReqVo = new ActWorkflowReqVo<>(); actWorkflowReqVo.setBusinessId("201912020001"); actWorkflowReqVo.setProcessId("leaveProcess"); List<LabelInfo> labelInfos = new ArrayList<>(); LabelInfo labelInfo1 = new LabelInfo(); labelInfo1.setLabName("userName"); labelInfo1.setLabType("S"); labelInfo1.setLabValue("will"); labelInfos.add(labelInfo1); actWorkflowReqVo.setLabels(labelInfos); ActWorkflowRespVo actWorkflowRespVo = workflowService.startWorkflow(actWorkflowReqVo); MySlf4j.textInfo("启动流程输出:{0}", JsonUtils.toJson(actWorkflowRespVo)); } /** 提交任务-请假申请*/ @Test public void testCompleteTask1() { ActCompleteTaskReqVo actCompleteTaskReqVo = new ActCompleteTaskReqVo(); actCompleteTaskReqVo.setComment("个人事务请假1天....."); actCompleteTaskReqVo.setProcessInstanceId("5001"); actCompleteTaskReqVo.setUserId("will"); actCompleteTaskReqVo.setProcessId("leaveProcess"); boolean res = workflowService.completeTask(actCompleteTaskReqVo); MySlf4j.textInfo("签收任务流程输出:{0}", res); } /** 提交任务-部门主管审批*/ @Test public void testCompleteTask2() { ActCompleteTaskReqVo<LabelInfo> actCompleteTaskReqVo = new ActCompleteTaskReqVo<>(); actCompleteTaskReqVo.setComment("同意"); actCompleteTaskReqVo.setProcessInstanceId("2501"); actCompleteTaskReqVo.setUserId("deman"); actCompleteTaskReqVo.setProcessId("leaveProcess"); List<LabelInfo> labelInfos = new ArrayList<>(); LabelInfo labelInfo1 = new LabelInfo(); labelInfo1.setLabName("opinion"); labelInfo1.setLabType("S"); labelInfo1.setLabValue("TH"); LabelInfo labelInfo2 = new LabelInfo(); labelInfo2.setLabName("days"); labelInfo2.setLabType("I"); labelInfo2.setLabValue("1"); labelInfos.add(labelInfo1); labelInfos.add(labelInfo2); actCompleteTaskReqVo.setLabels(labelInfos); boolean res = workflowService.completeTask(actCompleteTaskReqVo); MySlf4j.textInfo("签收任务流程输出:{0}", res); } /** 提交任务-HR审批*/ @Test public void testCompleteTask3() { ActCompleteTaskReqVo actCompleteTaskReqVo = new ActCompleteTaskReqVo(); actCompleteTaskReqVo.setComment("同意"); actCompleteTaskReqVo.setProcessInstanceId("2501"); actCompleteTaskReqVo.setUserId("petty"); actCompleteTaskReqVo.setProcessId("leaveProcess"); List<LabelInfo> labelInfos = new ArrayList<>(); LabelInfo labelInfo1 = new LabelInfo(); labelInfo1.setLabName("opinion"); labelInfo1.setLabType("S"); labelInfo1.setLabValue("TH"); labelInfos.add(labelInfo1); actCompleteTaskReqVo.setLabels(labelInfos); boolean res = workflowService.completeTask(actCompleteTaskReqVo); MySlf4j.textInfo("签收任务流程输出:{0}", res); } /** 查看任务是否签收*/ @Test public void testCheckClaimTask() { ActClaimTaskReqVo actClaimTaskReqVo = new ActClaimTaskReqVo(); actClaimTaskReqVo.setUserId("will"); actClaimTaskReqVo.setTaskId("2507"); boolean res = workflowService.checkClaimTask(actClaimTaskReqVo); MySlf4j.textInfo("查看任务是否签收输出:{0}", res); } /** 查看待办任务*/ @Test public void testQueryTodoTasks() { ActProcessTaskReqVo actProcessTaskReqVo = new ActProcessTaskReqVo(); actProcessTaskReqVo.setProcessId("leaveProcess"); actProcessTaskReqVo.setUserId("will"); actProcessTaskReqVo.setStartNum(0); actProcessTaskReqVo.setRecNum(10); ActProcessTaskRespVo actProcessTaskRespVo = workflowService.queryTodoTasks(actProcessTaskReqVo); MySlf4j.textInfo("查询待办任务输出:{0}", JsonUtils.toJson(actProcessTaskRespVo)); }
需要完整的代码可以私信!!!
猜你喜欢
- 2024-10-27 30分钟学会:springboot+mysql+camunda开源工作流引擎
- 2024-10-27 详解JavaEE中级程序员路线图,其涉及课程资源已更新
- 2024-10-27 吐血推荐一款开源工作流引擎:camunda使用入门
- 2024-10-27 工作流引擎开发系列一基础知识(工作流引擎的好处)
- 2024-10-27 超轻量级工作流引擎,只要七张表就解决工作流ingens...
- 2024-10-27 Windmill:最快的自托管开源工作流引擎
- 2024-10-27 Springboot整合工作流引擎Activiti(二)
- 2024-10-27 流程智慧:低代码开发平台工作流引擎的技术原理解析
- 2024-10-27 工作流引擎的工作原理与功能(工作流引擎是什么意思)
- 2024-10-27 免费开源,一款快速开发模块化脚手架,含工作流引擎
你 发表评论:
欢迎- 最近发表
-
- Java常量定义防暴指南:从"杀马特"到"高富帅"的华丽转身
- Java接口设计原则与实践:优雅编程的艺术
- java 包管理、访问修饰符、static/final关键字
- Java工程师的代码规范与最佳实践:优雅代码的艺术
- 编写一个java程序(编写一个Java程序计算并输出1到n的阶乘)
- Mycat的搭建以及配置与启动(mycat部署)
- Weblogic 安装 -“不是有效的 JDK Java 主目录”解决办法
- SpringBoot打包部署解析:jar包的生成和结构
- 《Servlet》第05节:创建第一个Servlet程序(HelloSevlet)
- 你认为最简单的单例模式,东西还挺多
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)