java flowable工作流_flowable工作流免费视频

java flowable工作流_flowable工作流免费视频1.2基本操作1.2.1编码准备这里一官网请假流程案例为例resources目录下新建一个holiday-request.bpmn20.xml文件1.2.2初始化DB运行脚本后会初始化相关表,后面一点点介绍查看act_re_deployment表查看act_ge_bytearray,记录xml文本字节数组,通过deployment_id关联,查看相关的api有列表查询、分页查询等1.2.4发起流程修改holiday-request.bpmn2

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

1 快速入门案例

1.1 maven 依赖

    <dependencies>
<dependency>
<groupId>org.flowable</groupId>
<artifactId>flowable-engine</artifactId>
<version>6.6.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.20</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.30</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.30</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.22</version>
</dependency>
</dependencies>

Jetbrains全家桶1年46,售后保障稳定

1.2 基本操作

1.2.1 编码准备

这里一官网请假流程案例为例
在这里插入图片描述

  • 我们假设该过程是通过提供一些信息开始的,例如员工姓名、请求的假期数量和描述。当然,这可以建模为流程中单独的第一步。但是,通过将其作为流程的“输入数据”,流程实例仅在发出实际请求时才实际创建。在另一种情况下,用户可以在提交之前改变主意并取消,但流程实例现在就在那里。在某些情况下,这可能是有价值的信息(例如,请求启动但未完成的次数),具体取决于业务目标。
  • 左边的圆圈称为开始事件。它是流程实例的起点。
  • 第一个矩形是用户任务。这是人类用户必须执行的过程中的一个步骤。在这种情况下,经理需要批准或拒绝该请求。
  • 根据经理的决定,专用网关(带有十字的菱形)会将流程实例路由到批准或拒绝路径。
  • 如果获得批准,我们必须在某个外部系统中注册请求,然后再次为原始员工执行用户任务,通知他们该决定。当然,这可以用电子邮件代替。
  • 如果被拒绝,则会向员工发送一封电子邮件,通知他们这一点。

resources 目录下 新建一个 holiday-request.bpmn20.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" xmlns:flowable="http://flowable.org/bpmn" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.flowable.org/processdef">
<process id="holidayRequest" name="Holiday Request" isExecutable="true">
<startEvent id="startEvent"/>
<sequenceFlow sourceRef="startEvent" targetRef="approveTask"/>
<userTask id="approveTask" name="Approve or reject request"/>
<sequenceFlow sourceRef="approveTask" targetRef="decision"/>
<exclusiveGateway id="decision"/>
<sequenceFlow sourceRef="decision" targetRef="externalSystemCall">
<conditionExpression xsi:type="tFormalExpression">
<![CDATA[ ${approved} ]]>
</conditionExpression>
</sequenceFlow>
<sequenceFlow sourceRef="decision" targetRef="sendRejectionMail">
<conditionExpression xsi:type="tFormalExpression">
<![CDATA[ ${!approved} ]]>
</conditionExpression>
</sequenceFlow>
<serviceTask id="externalSystemCall" name="Enter holidays in external system" flowable:class="org.flowable.CallExternalSystemDelegate"/>
<sequenceFlow sourceRef="externalSystemCall" targetRef="holidayApprovedTask"/>
<userTask id="holidayApprovedTask" name="Holiday approved"/>
<sequenceFlow sourceRef="holidayApprovedTask" targetRef="approveEnd"/>
<serviceTask id="sendRejectionMail" name="Send out rejection email" flowable:class="org.flowable.SendRejectionMail"/>
<sequenceFlow sourceRef="sendRejectionMail" targetRef="rejectEnd"/>
<endEvent id="approveEnd"/>
<endEvent id="rejectEnd"/>
</process>
</definitions>

1.2.2 初始化 DB

    @Before
public void init() { 

ProcessEngineConfiguration configuration = new StandaloneInMemProcessEngineConfiguration();
configuration.setJdbcDriver("com.mysql.cj.jdbc.Driver");
configuration.setJdbcUsername("root");
configuration.setJdbcPassword("hwl123456");
configuration.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/flowable?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true");
configuration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
engine = configuration.buildProcessEngine();
}

运行脚本后会初始化相关表,后面一点点介绍
在这里插入图片描述

1.2.3 部署流程

    @Test
public void testDeploy() { 

RepositoryService repositoryService = engine.getRepositoryService();
// 部署流程,部署后会在 act_re_deployment 和 act_ge_bytearray 表中添加记录
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("holiday-request.bpmn20.xml")
// 指定流程名称
.name("请假流程")
.deploy();
System.out.println(JSONUtil.toJsonPrettyStr(deployment));
}

查看 act_re_deployment 表
在这里插入图片描述
查看 act_ge_bytearray,记录 xml 文本字节数组,通过 deployment_id 关联,
在这里插入图片描述

1.2.4 查询流程

    @Test
public void testQuery() { 

RepositoryService repositoryService = engine.getRepositoryService();
Deployment deployment = repositoryService.createDeploymentQuery()
.deploymentId("1")
.singleResult();
System.out.println(deployment.getName());
}

查看相关的 api 有列表查询、分页查询等

1.2.3 删除流程

    @Test
public void testDelete() { 

// 如果部署的流程已启动则不能删除
engine.getRepositoryService().deleteDeployment("1");
// 如果流程已启动则相关的任务一并删除
engine.getRepositoryService().deleteDeployment("1", true);
}

1.2.4 发起流程

修改 holiday-request.bpmn20 文件,添加一个审批人
在这里插入图片描述

    @Test
public void testStart() { 

RuntimeService runtimeService = engine.getRuntimeService();
Map<String, Object> param = new HashMap<>(8);
param.put("employee", "张三");
param.put("days", 3);
param.put("description", "请假回家");
// 启动流程实例
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("holidayRequest", param);
// 启动后 act_ru_variable 表中记录参数信息
System.out.println(processInstance.getName());
}

发起流程后流程实例表 act_hi_procinst
在这里插入图片描述
流程任务表 act_ru_task,通过 proc_inst_id 和流程实例关联
在这里插入图片描述
流程执行过程 act_ru_execution,通过 proc_inst_id 和流程实例关联
在这里插入图片描述
提交参数表 act_ru_variable,通过 proc_inst_id 和流程实例关联,通过 execution_id 和执行过程关联
在这里插入图片描述

1.2.5 查询流程任务

    @Test
public void testQueryTask() { 

TaskService taskService = engine.getTaskService();
List<Task> list = taskService.createTaskQuery()
// 指定流程类型
.processDefinitionKey("holidayRequest")
// 指定办理人,通常用于查询我的待办
.taskAssignee("zhangsan")
.list();
System.out.println(JSONUtil.toJsonPrettyStr(list));
}

1.2.6 执行任务

根据 xml 文件配置拒绝流程发送邮件类
在这里插入图片描述

    @Test
public void testHandleTask() { 

TaskService taskService = engine.getTaskService();
Map<String, Object> param = new HashMap<>();
param.put("approved", false);
// 完成任务
taskService.complete("2509", param);
}

执行后看到控制台输出拒绝邮件
查看流程实例表 act_hi_procinst
在这里插入图片描述
有流程持续时间、开始节点、结束节点
查看流程任务表 act_ru_task 、流程执行过程 act_ru_execution 和提交参数表 act_ru_variable 已经被清空

1.2.7 查看历史信息

流程审批后,相关的中间数据都已经被清理了。如果查看流程提交记录需要查看历史信息

    @Test
public void testGetHistory() { 

HistoryService historyService = engine.getHistoryService();
List<HistoricActivityInstance> list = historyService.createHistoricActivityInstanceQuery().processDefinitionId("holidayRequest:1:3")
// 已结束的流程
.finished()
// 根据结束时间倒序排序
.orderByHistoricActivityInstanceEndTime().desc()
.list();
for (HistoricActivityInstance instance: list) { 

System.out.println(JSONUtil.toJsonStr(instance));
}
}

历史执行记录表 act_hi_actinst
在这里插入图片描述
历史表单参数表 act_hi_varinst
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/216371.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • visual studio2012产品密钥_visual studio激活码

    visual studio2012产品密钥_visual studio激活码YKCW6-BPFPF-BT8C9-7DCTH-QXGWC

    2022年10月15日
  • 线程通信(ITC)

    线程通信(ITC)为什么要通信通信是人的基本需求。而进程作为人的发明,自然脱离不了人的习性,也有通信需求。如果进程之间不进行任何通信,那么进程所能完成的任务就要大打折扣。例如,父进程在创建子进程后,通常须要监督子进程的状态,以便在子进程没有完成给定的任务时,可以再创建一个子进程来继续。这就需要父子进程间通信。而线程间的通信则需要更多。由于一个进程通常包括多个线程,这多个线程之间因资源共享自然地就存在一种合作关系。这种合作关系虽然可以表现为相互独立,但更多地时候是互相交互。这就是通信。就像舞台上的多个演员,他们之间是一种

  • 【自考】数据结构导论「建议收藏」

    【自考】数据结构导论「建议收藏」第一遍导图第一章第二.三章第四章第五章第六章第七章 

  • 用python删除文件_python运行另一个py文件

    用python删除文件_python运行另一个py文件python删除文件夹和文件

    2022年10月26日
  • pytest parametrize fixture_reno参数

    pytest parametrize fixture_reno参数前言当某个接口中的一个字段,里面规定的范围为1-5,你5个数字都要单独写一条测试用例,就太麻烦了,这个时候可以使用pytest.mark.parametrize装饰器可以实现测试用例参数化。官方示

  • Idea插件安装和管理「建议收藏」

    Idea插件安装和管理「建议收藏」1.打开插件视图点击File-&gt;Settings菜单,或Ctrl+Alt+S快捷键.打开设置面板.并切换到Plugins插件视图2.插件的管理和卸载当前idea中安装的所有插件(包括系统本身的和用户自己的)都会展示在列表中,右边的复选框表示当前插件的启用状态.在最右边的面板中显示了插件的具体信息和卸载按钮.当不需要插件时,…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号