03-Activity代码实现

简介: cascasca

1 创建bpmn流程
1resources下新建一个文件夹,名称随意,这里我们叫:bpmn
2右键,新创建一个:bpmnFile,名称随意,这里我们叫:hello.bpmn

OPENAPLSPECIFICATION

SCRATCHFILECTRL+ALT+SHIFT+LNSER

NEWACTIVITI6XBPMN2.0FILE

OPTIMIZEIMPORTS

XKOTINCLASS/FILE

NEW-ACTIVITI-DIAGRAM.BPMN2O

CTRL+SHIFT+F

FINDINFILES..

FINDUSAGES

RRNMAVEN

ZKOTLINSCRIPT

ADDTOFAVORITES

KOTLINWORKSHEET

REPLACEINFILES

AVAFXAPPLICATION

EDITFILETEMPLATES.

CTRL+ALT+L

FXMLFILE

ACTIVITYDEMO

HTMLFILE

CTRL+SHIFT+R

CTRL+ALT+O

ACTIVITYDEM

BPMNFILE

REFORMATCODE

CSSSTYLESHEET

TEST

COPYPATH..

目COPY

REFACTOR

IDEA

ERESOURC

DELETE

DELETE..

DIRECTONY

ALT+F7

CTRL+C

JAVA

PROIECT

OCO

OAPP

MAN

SCUT

ANALYZE

NEW

CTRL+X

兰FILE

CTR+V

JAVA

MAI

BPN

PASTE

SRC

ACTI

MOD:


3拖拽生成流程节点信息,这里我们简单操作,视频操作流程如下:

好了,截止目前我们就生成了一个简单的,单节点审批的工作流。接下来我们就将以此流程作为Demo,开始我们的学习之路。
2 部署流程定义
此代码是模拟我们开发好一套审批流程,后续员工就可以发起这个流程

请确保你已正确配置数据库连接(端口、用户名、密码),数据库处于启动状态,并且在本地创建了对应的数据库:activiti(名称可以随意)。
代码编写
上述代码唯一需要注意的地方,就是:addClasspathResource 中的路径,如果读者们与我保持不一致,请记得及时修改。
代码测试
运行单测,会发现日志中打印了大量的DDL语句,这是因为Activiti作为一款成熟的工作流引擎框架,他已经有了完善的数据库:

09:14:12.249[MAIN]DEBUGOG.ACTIVITI,ENGINE.IMPL,DB,DBSQLSESION-SQL:CREATETABLEACT_REDEPLOYWEIT(

9:14:12,240[MAIN]DEUGONG,ACTIVITI,ENGINE.IMPL,DB,DBSQLSESION-SQL:CREATETABLEACT_6E_BYTEARAY(

NGINE=INNODBDEFAULTCHARSET=UTF8COLLATEUTF8_BIN

CATEG0RY_VARCHAR(255)

VALUES(NEXT.DBID','1',1)

>>YTESTSPASSED:1OF1TEST-3S421MS

DEPL0YMENT_ID_VARCHAR(64)

NAMEVARCHAR(255),

NAMEVARCHAR(255),

GENERATED_TINYINT,

PRIMARYKEYLLD-

DEPLOYMEN13S421MS

DVARCHARO4)

IDVARCHAR(64,

BYTES_LONGBLOB

REVINTEGER

09:14:12.249[MAIN

ACTIVITITEST(COR3S421MS

ANOBAN255)

G9:14:12.2401A

ACTIUITITESTDEPLOVMENTPROCESSDEFINITION

VON

O三云


执行完成我们在最后的日志中看到输出结果:

0:14:13,6[NAIN]DEUGONGAPACHE,IBETIS,DATASOURCE,POLE0.FOOLEADATASOUNCE-RETURNEDCNECTTON102C94302/TOPOL.

9:14:13.7O6[NAIN]DEBUEONG,ACTIVITI.ENGINE,IMPLCFG,STANDALONE.STANDALONENYBATISTRANSACTIONCONTEXT-FIR

O9:14:13.766[NAIN]DEUGONG,AOTIVITI,ENGINE.IMPL.INTERCEPTOR.LOGLINTERCEPTOR---LEPLOYCMDFINISHED

09:14:13,766[MAIN]DEBUGONG,ACTIVITI,ENGINE.IMPL,INTERCEPTOR.LOGINTERCEPTOR

011110220

:L4:L3.76LNAINDEUGONG,APACTE,IBATIS,TRANSACTION,JDBC,JDBCITRANSACTION-RESETINGAUTOCOMITTOTRUEONJBC

NNECTIONLCOM.MYSQ.JDBC.JDBC4CONNECTIONG6O9DB43B]

流程部署名称:测试入门案例

JDBC.JDBC4CONNECTION@609DB43B]

>TESTSPASSED:1OF1TEST-3S421MS

ACTIVITITEST.DEPLOYMENTPRO

ACTIVITITEST(COR3S421MS

JDBC4CONNECTION@609DB43B]

DEPLOYMENI3S421MS

流程部署ID:1

0县三云

COMMITTED,,.

ONOEPROBLEMS

DTERINAL

OCONARLT

OPROLEL

1EVENTLOG

ENDPO

PROCESSDEFINITION

G9:14:13.766LMA1NJUEB00U9.OPA**

S

NOITS

.JDBC4CONNECTIE".....AANACHE.IBATIS,DATASV"..,..ONINTER(

人B0

PID

3S421MS09:14:13

.[EOM.MVS0L,J0DG.UUV...NANEAOTI0N,JDC,J0LO"

.A1了.760..THATI..NEAOTT0..10402

2


此时我们去刷新数据库,会发现多了25张表,如下(大概表分类我们放在:04-Activiti拓展篇讲解,这里只讲最简单的上手Demo):

DACTRUDEADLETTERJOB

ACTRUSUSPENDEAJOB

DACTGEBYTEARRAY

ACTRUIDENTITYLINK

INFORMATIONSCHEMA

ACTHIATTACHMENT

ACTPROCDEFINFO

ACTHIIDENTITYLINK

PERTORMANCESCHEMA

BACTRUEXECUTION

EACTGEPROPERTY

DACTHIPROCINST

BACTREPROCDEF

坦ACTRUTIMERJOB

EACTHIVARINST

EACTRUVARIABLE

192.168.206.130

甘ACTHIACTINST

当ACTREDEPLOYMENT

ACTHITASKINST

ACTEVTTLOG

ACTRUINTEGRATION

重ACTRUJOB

ACTHIDETAIL

DOCTORSTATION

ACTHICOMMENT

EACTREMODEL

CLOUDORDER

日ACTRUEVENTSUBSCR

国ACTRUTASK

SEATAWORK

SEATADEMO

LRONMAN

6视图

CLOUDUSER

娜事件

画数

NACOS

ACTIVITI

LOCA

电表

SEATA

MYSGL

CRUC

报表

备份

查询

国A


此时,最关键的来了:我们去:act_re_procdef中会发现有我们刚才的流程定义:

备注十六进制二图

HTTP://WWW.ACTIVITI.ORG/TEST

ACT_RE_PROCDEF@ACTIVITI(LOC

网格查看表单查看

RESOURCENAME

BPMN/HELLO.BPMN

导入向导导出向导

升序排序A降序排序

DEPLOYMENTID

序移除排序自

MYPROCESS1

CATEGORY

编辑查看

VERSION

Y篇选向导

(NULD)

MYPRO

NAME

帮助

看窗口

KEY

REV

文件

11

出网格查看

OCAL)-表


这就验证了我们的流程定义代码测试成功。相当于我们公司现在有了一个单节点的审批流程,后面就等着用户发起,这个流程就可以使用起来。
3 启动流程实例
此代码模拟的就是某个用户开始提交流程,此时就会开启某个流程,如下

总部政中心

办公室-行...

协同

流程

[知会]

何波

催力

何波

何波

表单

END

何波

8


这里面需要注意的是:流程实例的key,对应表:act_re_procdef.key字段,二者必须保持一致,也就是bpmn文件id属性值。
当我们执行完成,输出打印如下:

O9:20:24,386(NAIN]DEBUGORNG,APACHE,IBATIS.TRANSACTION.JDBC,JTBCTRANSACTION-RESETINGAUTOCONMN2TTOTRUEONUB

09:20:24,356[MAIN]DEBUGORG,ACTIVTTI,ENGINE.IMP1.INTERAEPTOR.LOAGLINTENCEPTOR---STARTPNOCASSINSTANCECNDF

O,AE,RNTN1NEAUGAPNAPACHE,IHATIS,DATASOUNCE,POLED.POOLEDATASOUNCE-RETUMEDCONECT1ON1OLC94E0C1TOP0.

[MAIN]DEBUEONG,APACHE,IBATIS,TRANSAECTION.JDBC,JDBCTRANSACTION-CLOSINGJDBCCONECTIONLCOM.MYSGL,JDBC

09:20:24.356[MAIN]DEBUGORG,ACTIVITI.ENGINE.IMPL.INTERCEPTOR.LOGINTERCEPTO

CNNENTION[COM.MYSAL.IDBC,JDBC4CONNECTION@609DD43D

Y02三->VTESTSPASSED:1OF1TEST-2S69MS

程实例定义ID:川YPROCESS_1:1:3

09:20:24.356[MAIN]DEBU6ORG.APAC

RUN:ACTIVITITESTSTARTPROCESSLNSTANCE

.JDBC4CONNECTION@609DB43B]

CONNECTIONLCOM.MYSQTJDDC.PP

ACTIVITITEST(COM2S69MS09:

------------------------------------------------------

09:20:24.356[MAIN]DEBU6ORG.APAC

STARTPROCESSL2S69MS

流程实例ID:2501

TERMINALGPROFILERYENDPOINTS

09:20:24.3.0LA+............+.ONA6G9D

NTOOM9S9BO司

120008022T2.

VQ


此时我们去:act_ru_task 表中可以看到生成一个新的task数据,即当前用户开启了一个新的流程

排序A降序排序移除排序

备注十六进制二图象

出网格查看表单查

ACTREPROCDEF@

EXECUTIONID

PROCINSTID

ARENTTASKID

YPROCESS1:1:

为导入向导

PROCDEFID

Y篇选向导

UTASK@ACTIVITI(LO

DESCRIPTION

导出向导V

目ACTRUTA

TASKDEFKEY

@ACTIVITI..

SERTASK

NAME

文件编

2505

2502

2501

REV

NUL

查看

帮助

1D

NU

窗口

X


同时可以查看到流程的多个任务节点信息:act_ru_execution

山备注十六进制口图像升序排序降序排序移除排序自定义排序

PROCDEFIDSUPEREXECROOTPROCINSTJIDACTID.ISACTIVE.

重ADTRUEXECUTION@ACTIV

国导入向导导出向导

MYPROCESS1:1:3(NUL)

ACTRE_PROCDEF@ACTIVITI

YPROCESS1:1:3

ECUTION@ACTIVITI(LOCAL)

ISCONCURRENT

BUSINESSKEY

PROCINSTID

田网格查看引表单查看

PARENTID

SK@ACTIVITI(LO.

文件编查看

ISSCOPE

ISEVENTS

(NUL)

12501

REV

(NUL)

2501

2501

NULD

窗口

2501

(NUL)

2501

口帮助

X由ADT


4 查询当前任务
此代码模拟员工查询目前审批在哪个节点,好催促对应审批人员进行审批
运行后代码输出如下:

,094[NAIN]DEBUGORG,APACHE,IBATIS,DATASOURCE,POOLED.POLEDATASOUNCE-RETUNNEDCONECTION1L620940271

N,,O,,A,[MAIN1NERUGNNN,AOTIVITI,ENGINE.IMPL,INTERCEPTOR,LOINTENCEPTOR----TAS从QVERYMG以

AO.CA.(,AA4[MAIN]DEBUGORQ,ACTIVITI,ENGINE.IMPL.INTERCEPTOR,LOGLNTERCEPTOR

9:48:24,OO4[MAIN]DEBUGORG,APACHE,IBATIS.TRANSACTION,JDBC.JDBCTRANSACTION-

4444444424-444-64464C4642404774470740407077007077077

0三>VTESTSPASSED:1OF1TE

任务流程定义IDMYPROCESS_1:1:3

建时间THUJUL2709:20:24CST2023

ACTIVITITEST(COR1S681MS09:4

ACTIVITITESTFINDPERSONALTASKX

.JDBC4CONNECTION@609DBAODJ

任务流程实例D2501

任务执行ID2502

FINDPERSONA1S681MS

任务指定人NULL

G9:48:24.00411811:2.

任务ID2505

仟务名称USERTASK

任务创建时间THUJU

09:48:24.004[MAIN]

AJDBCCONNECTION[COM.MYSGL.JDBC

2


5 完成指定任务
此代码模拟某个用户完成对应的节点,即:审批通过/拒绝,流程就会自动流转至下一个节点
需要注意的是,此id对应的是上述:4 查询当前任务 返回任务ID保持一致。
当运行完成后,表:act_ru_task、act_ru_execution这种进行中数据都会清空,进入到:act_hi_**表中。
以上我们就完成了一个简单的工作流引擎代码编写与测试。
6 完整代码汇总

Java

运行代码复制代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

package com.demo;


import org.activiti.engine.ProcessEngine;

import org.activiti.engine.ProcessEngines;

import org.activiti.engine.RepositoryService;

import org.activiti.engine.repository.Deployment;

import org.activiti.engine.runtime.ProcessInstance;

import org.activiti.engine.task.Task;

import org.junit.Test;


import java.util.List;


public class ActivitiTest {


   @Test

public void deploymentProcessDefinition(){

//创建ProcessEngine对象

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

//获取RepositoryService对象

RepositoryService repositoryService = processEngine.getRepositoryService();

//进行部署

Deployment deployment = repositoryService

.createDeployment()

.name("测试入门案例")

.addClasspathResource("bpmn/hello.bpmn")

.deploy();

//输出部署的一些信息

System.out.println("流程部署ID:"+deployment.getId());

System.out.println("流程部署名称:"+deployment.getName());

}


   @Test

public void startProcessInstance(){

//获取与正在执行的流程示例和执行对象相关的Service

ProcessInstance processInstance = ProcessEngines.getDefaultProcessEngine().getRuntimeService()

//使用流程定义的key启动实例,key对应bpmn文件中id的属性值,默认按照最新版本流程启动

.startProcessInstanceByKey("myProcess_1");

System.out.println("流程实例ID:"+processInstance.getId());

System.out.println("流程实例定义ID:"+processInstance.getProcessDefinitionId());

}


   @Test

public void findPersonalTask(){

//与正在执行的任务相关的Service

List<Task> list = ProcessEngines.getDefaultProcessEngine().getTaskService()

.createTaskQuery()  //创建查询任务对象

//          .taskAssignee("UserTask")  //指定个人任务查询,指定办理人

.list();

if(list != null && list.size() > 0){

for(Task task : list){

System.out.println("任务ID" + task.getId());

System.out.println("任务名称" + task.getName());

System.out.println("任务创建时间" + task.getCreateTime());

System.out.println("任务指定人" + task.getAssignee());

System.out.println("任务流程实例ID" + task.getProcessInstanceId());

System.out.println("任务执行ID" + task.getExecutionId());

System.out.println("任务流程定义ID" + task.getProcessDefinitionId());

}

}

}


   @Test

public void completePersonalTask(){

// 对应task表的id

ProcessEngines.getDefaultProcessEngine()

.getTaskService()

.complete("2505");

}


/**

    * 1-2-3-4

    *

    * 2-1-3-4

    * 3-1-2-4

    * 流程编排、流程可视化

    */

}


若有收获,就点个赞吧


相关文章
|
9月前
|
人工智能 供应链 数据可视化
工作流梳理工具实战教程:手把手教你绘制第一张自动化流程图
本文剖析了团队因流程混乱导致重复劳动和效率低下的问题,提出通过工作流梳理提升协作效率的解决方案。总结了流程梳理的六大核心需求,并深度测评了6款主流工具,国内有板栗看板那,国外有kiss flow结合团队规模与需求提供选型建议,助力企业高效落地流程优化。
|
5月前
|
缓存 Java 关系型数据库
|
5月前
|
canal 缓存 关系型数据库
|
5月前
|
负载均衡 算法 Java
|
5月前
|
负载均衡 算法 Dubbo
|
5月前
|
数据可视化 Java 关系型数据库
01-认识Activiti
工作流指如请假、报销等需审批的业务流程,通过流程引擎实现可视化与自动化。它支持单/多节点审批,广泛应用于CRM、TMS、WMS等系统。主流技术包括BPMN、Activiti和Flowable,推动了泛微、金蝶等企业的发展。
|
5月前
|
XML Dubbo Java
|
5月前
|
设计模式 Dubbo Java