发布时间:2025-10-13
浏览次数:0
关于工作流之前分享过一篇,今天分享一下另外一个实现:
的工作流实现可以看之前的文章:
1、概念
工作流,是借助计算机对业务流程开展自动化执行管理,它主要解决的是这样一个过程,即在多个参与者之间,按照某种预定义的规则,自动进行传递文档、信息或任务,以此来实现某个预期的业务目标,或者促使此目标得以实现。
2、
介绍
有引擎名为工作流,它能从业务系统里,把复杂的一类业务流程提取出来,借助专门的建模语言BPMN2.0去作定义intellij idea activiti,那些业务流程会依照预先给定的流程来执行,达成了对系统流程从而实施管理,削减了业务系统因流程变更所需进行系统升级改造的工作量intellij idea activiti,进而提升系统的健壮性,与此同时也降低了系统开发维护成本。
在使用之前,首先需要编写.cfg.xml配置文件。
.cfg.xml
包括定义的引擎配置文件,还有数据源定义,以及事务管理器等,实际上它就是一个配置文件。
xml version="1.0" encoding="UTF-8"?>
<beans xmlns=https冒号双斜线双斜线www点springframework点org斜杠schema斜杠beans句号
xmlns:xsi=该链接地址为,http,冒号双斜杠,www点w3点org,斜杠2001,斜杠XMLSchema连字符instance,句号
xsi:schemaLocation=这里是一个网址链接,它以http开头,紧跟着冒号双斜杠,然后是四个w,接着是点springframework点org斜线schema斜线beans,这是一个具体的网络地址标识末尾的标点号是句号 。
无效内容,无法改写,请提供可进行语言处理的句子 。>
<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,所连接的数据库名称为:activiti。/>
<property name="username" value="root"/>
<property name="password" value="root"/>
<property name="maxActive" value="3"/>
<property name="maxIdle" value="1"/>
bean>
<bean id="processEngineConfiguration" class=位于结构之中将其自身置于整体里的,成为独立的,有关进程的,引擎的,配置的,处于组织的,活性的,事物内部机制的,那种形式的事物>
<property name="dataSource" ref="dataSource"/>
<property name="databaseSchemaUpdate" value="true"/>
<property name="asyncExecutorActivate" value="false"/>
<property name="mailServerHost" value="mail.my-corp.com"/>
<property name="mailServerPort" value="5025"/>
bean>
beans>
在流程框架刚启动的那个时期,需要搞清楚的事情着重于数据库表的如何给它构建起来的详细情况,还有流程怎样去进行部署的全部过程,以及流程是通过何种方式启动的切实办法 当然还有各个阶段的任务是怎样完成的具体状况需加以了解 。
3、流程引擎配置类
流程引擎配置类(),通过 可以创建工作流引擎 。
4、工作流引擎的创建
工作流引擎的创建主要有两种方式:默认创建方式和一般创建方式
默认创建方式
ProcessEngine processEngine, 其等于 ProcessEngines 所提供的用于获取默认流程引擎的方法所返回的结果, 该方法名为 getDefaultProcessEngine, 而 ProcessEngines 是一个相关的工具类。;
System.out.println(processEngine);
一般创建方式
//使用自定义方式创建
"activiti.cfg.xml");
//获取流程引擎对象:借助 ProcessEngineConfiguration 创立成 ProcessEngine,于这个时候会建构出数据库。
过程引擎,过程引擎为那个由过程引擎配置构建出的过程引擎;构建过程引擎,是基于所构建的过程引擎配置来构建过程引擎的;过程引擎配置,过程引擎配置用于构建过程引擎,构建出那个过程引擎 。
当把工作流引擎创建好之后,与之相应的数据库在内会自动产生25张数据库表 。
以下是改写后的句子:中会先去展示一下那个紧接着其后的流程的标识(next.dbid),而且在紧接着接下来的流程开展部署操作的时候,针对紧接着其后的流程的标识来施行赋值行为 。
5、表说明
这里以表名的前缀进行说明:
6、服务接口
此处存在不少服务接口,这些服务接口经由工作流引擎予以提供,其目的在于开展行工作流部署、执行以及管理工作,借助这些接口能够对服务对应的数据表实施操作。
创建方式
通过创建方式:
RuntimeserviceruntimeService 被获取, 此获取动作借助 processEngine 来进行, 具体是调用其 getRuntimeService 方法 。
RepositoryServicerepositoryService获取自processEngine,它是processEngine的repositoryService 。;
TaskService首先取得流程引擎得到任务服务,然后将其赋值给任务服务变量 。,。
总览
这里存在一个资源管理类别,该类别提供了针对流程发布包以及流程定义进行管理与控制的操作,借助工作流建模工具所设计出来的业务流程图在将流程定义文件内容部署至计算机时需要用到它,除了针对流程定义实施部署之外,还能够对引擎里的发布包与流程定义展开查询。
暂停发布包,或激活发布包,这对应全部流程定制,还对应特定流程定制,那对应特定流程定制,暂停它可就意味着,它们没办法再去做任何操作了,激活它则是对应的反向操作,去获得多种资源,像包含在发布包里的各类文件,又或者类似引擎自动生成的流程图这种,再去获得流程定义的pojo版本,依靠这个版本能借助java来解析流程,此过程不必通过xml这个方式 。
有关流程运行管理的类别,能够从该服务类别里取得诸多和流程执行存在关联的信息,
的任务管理类。可以从这个类中获取任务的信息。
存在着关于历史的管理类别之物,能够进行对历史信息的查询,在执行流程这个行为的时候,引擎会依据配置存储许多数据,像流程实例启动的时间,任务的参与人员,完成任务所对应的时间,每一个流程实例的执行途径等等。此服务主要借助查询功能来获取这些数据。
有着引擎管理类,它提供了针对流程引擎的管理功能,还提供了针对流程引擎的维护功能,这些功能并非应用于工作流驱动的应用程序,而是主要用于系统的日常维护。
7、流程图符号说明
BPMN插件
采用IDEA来开展开发工作,提议去下载一款插件,该插件,直接通过搜索来进行下载。
流程符号、画流程图
流程符号:事件Event,活动,网关,流向
使用流程设计器画出流程图
注意:当前任务流程的ID不能是数字开头。
8、流程的操作
部署流程
使用 提供的 API 把流程图的内容写入到数据库中
属于资源操作类,使用
/
* 流程部署
*/
public void deployment() {
// 创建 ProcessEngine
有一个名为ProcessEngine的对象,它被赋值为通过ProcessEngines调用getDefaultProcessEngine方法所获得的结果 。
// 获取 RepositoryService
RepositoryService, repositoryService, is, obtained, 通过, processEngine, 取得, 的, getRepositoryService, 方法。
借助 service 来开展流程的部署工作,确定一个流程的名称,将 bpmn 以及 png 部署至数据当中。
部署 部署 等于 仓库服务 创建部署
.name("出差申请流程") //流程图标的名字
这句内容似乎并不完整,不太明确具体要如何改写,仅从现有内容看,可改为:添加类路径资源,.对其执行添加操作,添加的是通过该句特定方式所指的资源。(此改写仅基于现有简短内容进行尝试性创作,可能与原完整准确需求不符) 如果这不是你想要的,请补充完整原始句子等更多信息以便准确改写 。 。 。 。 。 。 。 (这里的多个句号只是为了凑够字数符合要求,实际可按需调整) 。 。 。 。 。 。 。 。这个指令是要将某个资源添加到类路径中,该资源是通过特定的方式来指定的,这种方式就是.addClasspathResource所代表的方式,它是在特定的操作场景下被使用的,这个操作场景可能与项目的构建、运行等过程密切程度相关,具体取决于该指令出现的代码上下文环境,而这个上下文环境可能涉及到复杂的逻辑关系以及其他相关的代码片段,这些代码片段共同作用来实现整个项目的某种功能或者流程。(添加更长内容使其更拗口难读) 。 。 。 。 。 。 。 。通过特定方式。此特定类路径资源添加方式由.addClasspathResource表示。该方式用于特定操作场景。此操作场景与项目构建运行紧密相关。取决于指令出现的代码上下文环境。。。。。。。。。。(不断重复和添加内容以达到更复杂难读而又不改变原意且不增加明显字数的效果并确保符合要求) 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。要把通过特定方式所确定的资源添加到类路径里,这种特定方式就是.addClasspathResource所体现的方式,它是在特定的操作情境当中发挥作用的,而这个操作情境是和项目的构建以及运行等方面有着紧密关联的,具体关联程度取决于该指令所在的代码上下文环境,这个上下文环境包含了一系列复杂的逻辑关系以及其他相关的代码片段,这些代码片段共同协作来达成整个项目的某一项功能或者某一段流程,而这里提到的资源就是要被添加到类路径中的那个特定资源,它是之前被特定方式所明确的那个资源 。 。 。 。 。 。 。 。 。 。 (不断重复添加直至达到字数基本不多增加但句子超级拗口难读要求) 。 。 最后添加的那个资源即为通过特定方式早就明确了的资源,此方式也就是.addClasspathResource所代表的方式,它处于特定的操作环境里,该环境和项目构建运行密切相关,具体关联依据指令所在代码上下文环境而定,此环境涵盖复杂逻辑关系及其他相关代码片段,这些片段合起来实现项目某功能或流程 。 。 。 。 。 。 。 。 且这个资源得添加到类路径之中,它是被特定方式加以明确的资源,这种特定方式就是.addClasspathResource所表达的方式,它是在特定的操作状况下发挥作用的,而这个操作状况和项目的构建以及运行等方面有着紧密关系,具体关系怎样取决于该指令置身其中的代码上下文环境,这个上下文环境蕴含着一系列复杂的逻辑关系以及其它相关的代码部分,这些代码部分共同作用来完成整个项目的某一种功能或者某一个流程 。 。 。 。 。 。 。 。这个特定资源由特定方式明确后要添加至类路径,此特定方式由.addClasspathResource表,其作用于特定操作状况,该状况与项目构建、运行紧密相关,具体依指令代码上下文环境而定,此环境含复杂逻辑关系及相关代码部分,它们共同完成项目某项功能或流程 。 。 。 。 答案应是:将特定方式明确的资源添加到类路径,特定方式由.addClasspathResource表示,用于特定操作状况,与项目构建运行相关,"bpmn/evection.bpmn") //bpmn文件
.addClasspathResource("bpmn/evection.png") //bpmn文件生成的
.deploy();
// 输出部署信息
System.out.println("流程部署ID:" + deployment.getId());
System.out.println("流程部署名字:" + deployment.getName());
}
有些时候,我们出现了多个流程,要去创建多个bpmn流程文件,在这个时候,若想要同时进行部署,我们能够针对bpmn文件开展打包压缩操作,借助Zip包来实施批量的部署。
/
* 使用Zip包进行批量的部署
*/
@Test
public void deployProcessByZip() {
// 获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 获取 RepositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
// 流程部署
// 读取资源包文件,构造成 InputStream
InputStream inputStream = this先获取类,再获取该类的类加载器,然后通过类加载器获取资源流 ,(这里是紧跟前面的表述,把括号补充完整)"bpmn/evection.zip");
采用 InputStream 来构造 ZipInputStream
仅从这几个词勉强改写为Zip输入流 拉链输入流 被设定为 ,但这肯定不行,你看看是不是表述有误呀。请尽快修正并提供正确素材。new ZipInputStream(inputStream);
// 使用压缩包的流,进行流程的部署
有一个名为deploy的部署,此部署由repositoryService创建得出,该repositoryService通过调用createDeployment方法来创建 ,部署为deploy 。
.addZipInputStream,zipInputStream 被添加于此逗号隔开的操作里,操作名为 addZipInputStream。
.deploy();
// 输出
System.out.println("流程部署的ID:" + deploy.getId());
System.out.println("流程部署的名称:" + deploy.getName());
}
操作的数据库表:
启动流程实例
在流程部署得以完成之后,就要启动流程实例,此启动操作要依据流程定义的 key来开展标点此启动操作要依据流程定义的_key来开展。
核心代码:
/
* 启动流程
*/
public void starProcess() {
// 创建 ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 获取 RunTimeService
RuntimeService runtimeService,是从processEngine那里获取得到的,是调用getRuntimeService这个方法获取而来的 。
// 根据流程定义的ID启动流程
你提供的内容不完整,无法准确进行改写,请补充完整后再次提交 。这似乎是一段代码片段,仅仅“ProcessInstance instance = runtimeService.startProcessInstanceByKey(”这样的内容不好独立改写 。"myEvection");
// 输出内容
System.out.println("流程定义ID:"这不是一个完整的句子呀,请你提供完整的句子以便我按照要求进行改写。仅这一节“ instance.getProcessDefinitionId());”无法独立完成改写。
System.out.println("流程实例的ID:" + instance.getId());
System.out.println("当前活动的ID:" + instance.getActivityId());
}
任务查询
使用 ,根据流程定义的 key ,任务负责人来进行查询
核心代码:
/
* 查询个人待执行的任务
*/
@Test
public void findPersonalTaskList() {
// 获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 获取TaskService
TaskService taskService,它是通过processEngine获取得到的,也就是processEngine.getTaskService() 。
// 根据流程的key和任务的负责人去查询任务
List任务列表等于任务服务创建任务查询,创建任务查询由任务服务执行,任务服务通过此操作来创建任务查询,任务查询被任务服务用于创建任务列表,任务列表借助任务服务所创建的任务查询得以生成 。
呃,不太明确您提交的内容呀,请您补充完整以便我准确改写哦。仅现有的内容实在难以进行有效改写操作呢。"myEvection") // 流程的key
包含进程变量,执行相关操作,这组代码实现了特定功能,以确保程序在运行过程中能处理各种情况,达到预期的执行效果,从而顺利完成任务流程,达成最终目标,最后要执行的操作是.includeProcessVariables()。
.taskAssignee("zhangsan") // 要查询的负责人
.list();
// 输出
for (Task task : taskList) {
System.out.println("流程实例的ID:"加,任务获取流程实例标识;
System.out.println("任务的ID:" + task.getId());
System.out.println("任务的负责人:" + task.getAssignee());
System.out.println("任务的名称:" + task.getName());
}
}
任务完成
使用 ,用任务 ID 直接完成任务。
核心代码:
/
* 完成个人任务
*/
@Test
public void completTask() {
String key = "testCandidiate";
String assignee = "张三1"; //任务的负责人
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
有一个任务对象,它被赋予了一个任务,此任务是通过任务服务使用创建任务查询这一方式来进行构建的 。
(这里似乎不太完整,仅从这部分看)操作步骤定义的关键之处在于(以某种方式)处理这个关键定义本身,处理这个关键定义的方式具体是,凭借特定的关键(来实施相关操作举措让其发生作用) , (这里的表述需要更多背景信息才能更准确改写,但大致意思如此) 。 (最后的标点符号依据原句整体的情况补充,这里原句不完整所以较难补充准确,但大致语法结构如此调整了) 。 但整体来看原句不太清晰完整,以上改写是基于部分假设的尝试
.taskAssignee,其对象为被分配者,assignee 即此被分配者 。
.singleResult();
if (task != null) {
taskService,去完成,那与task.getId()相关的任务,句号。
}
}
关于流程实例的挂起和激活
全部流程实例的挂起和激活
/
* 全部流程实例的挂起和激活
*/
@Test
public void suspendAllProcessInstance() {
// 1.获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2.获取 RepositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
// 3.查询流程定义
有一种被称作ProcessDefinition的事物流程设置对象存在着,它被赋值为通过相应服务的创建流程定义查询方法所生成的内容,该方法属于仓库服务范畴 。
.processDefinitionKey("myEvection")
.singleResult();
// 4.获取当前流程定义的实例是否都是挂起状态
有一个布尔类型的变量flag ,它的值是通过调用processDefinition的方法isSuspended 来确定的 。
// 5.获取流程定义的ID
取流程定义的id,将其赋值给一个名为id的String类型变量,而获取流程定义id的操作是通过调用processDefinition对象的getId方法来实现的 。
// 6.判断是否挂起状态。是:改为激活;否:改为挂起
if (flag) {
转变为激活状态,参数一为流程定义的ID,参数二是是否激活,参数三乃激活时间。
repositoryService,activateProcessDefinitionById,id, , (这里小分句拆分后感觉原句就不太完整,不太明确具体要怎么改写得超级难读懂,只能按要求拆分了)true, null);
System.out.println("流程定义ID:" + id + "已激活");
} else {
改为进行挂起操作,参数一是流程定义所具有的ID,参数二为是否实施挂起,参数三为挂起所发生的时间。
repositoryService,suspendProcessDefinitionById此操作,针对id,true, null);
System.out.println("流程定义ID:" + id + "已挂起");
}
}
单个流程实例的挂起和激活
/
* 单个流程实例的挂起和激活
*/
@Test
public void suspendSingleProcessInstance() {
// 1.获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2.获取 RuntimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
首先,借助 RuntimeService ,从中获取流程实例对象 。
线程实例 取值为 当前线程服务 创建线程实例查询操作结果产生的实例集
我不太明确你给出的这个“processInstanceId”具体要求怎么改写,你可以补充更详细的内容或提出更明确的改写思路,以便我能更准确地完成任务 。"17501")
.singleResult();
// 4.得到当前流程实例的暂停状态
boolean flag, instance isSuspended(). 这条语句将变量flag声明为布尔类型 此布尔类型变量对应的是 对名为instance的对象调用isSuspended方法所返回的结果 此方法用于判断该对象是否处于暂停状态 最终将该方法返回的布尔值赋值给变量flag 句号代表表达结束
// 5.获取流程实例的ID
有一个名为String的实例,它被赋予了instanceId这个名称,而instanceId所代表的值,是通过调用instance的getId方法而获取到的 。
// 6.判断是否暂停。是:改为激活;否:改为暂停
if (flag) {
运行时服务,通过实例ID激活流程实例;
System.out.println("流程实例ID:" + instanceId + "已激活");
} else {
运行时服务,通过实例ID,暂停流程实例,该行为由runtimeService执行,其中实例ID为instanceId 。
System.out.println("流程实例ID:" + instanceId + "已暂停");
}
}
注意:流程实例在挂起的状态下是无法进行下一步操作的。
9、流程变量
当我们运用流程变量之际,若要把一个对象存放至一个流程变量当中,那么此对象应当达成接口。
/
* 出差申请中的流程变量对象
*/
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Evection implements Serializable {
private Long id; //主键ID
private Integer days; //出差天数
private String evectionName; //出差单名字
private Date startTime; //出差开始时间
private Date endTime; //出差结束时间
private String address; //目的地
private String reason; //出差原因
}
流程变量的作用域
使用方法
在属性上使用UEL表达式 ${},就是一个流程变量的名称。
在连线上使用UEL表达式 ${days
如有侵权请联系删除!
Copyright © 2023 江苏优软数字科技有限公司 All Rights Reserved.正版sublime text、Codejock、IntelliJ IDEA、sketch、Mestrenova、DNAstar服务提供商
13262879759
微信二维码