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中会发现有我们刚才的流程定义:
备注十六进制二图
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
* 流程编排、流程可视化
*/
}
若有收获,就点个赞吧