导图社区 activiti
Activiti是一个项目的名称,Alfresco软件在2010年5月17日宣布Activiti业务流程管理(BPM)开源项目的正式启动,其首席架构师由业务流程管理BPM的专家 Tom Baeyens担任。
编辑于2022-10-13 21:57:41 重庆activiti工作流
数据表
通用数据表 ACT_GE开头
流程存储表 ACT_RE开头
身份数据表 ACT_ID开头
运行时数据表 ACT_RU开头
历史数据表 ACT_HI开头
流程引擎配置 ProcessEngineConfiguration
ProcessEngineConfiguration对象实activiti流程的一个全局配置对象
创建配置
通过ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration()创建,同时set赋值数据库相关配置(jdbc、username、password等),或者是set一个dataSource
或者通过xml方式配置
ProcessEngineConfiguration processEngineConfiguration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("xml");
数据源配置
可以使用三方的数据源,配置DataSource实现
数据库策略配置
databaseSchemaUpdate
false,默认,activiti启动时会对比数据库,没有表则会报异常
true,activiti启动时会对所有的表进行更新,如果表不存在则会自动创建
create-drop,activiti启动时会删除原来的表结构,重新创建表
历史记录配置
history
none,不保存任何的历史数据,效率最高
activity,只保存流程和流程行为数据,其他不保存
audit,除了activity级别,还会保存流程任务及属性数据,默认值
full,全部数据,级别最高
asyncExecutorActivate配置
配置异步执行器,true表示启动
邮件服务器支持
SpringProcessEngineConfiguration
Spring整合,需要注入datasource数据源、transaction事务管理
推荐使用
StandaloneInMemProcessEngineConfiguration
StandaloneInMemProcessEngineConfiguration
流程引擎对象 ProcessEngine
ProcessEngines对象
init方法
会读取activiti的默认配置,创建ProcessEngine实例缓存到Map中
一般指在classpath目录下的activiti.cfg.xml文件
Map<String, ProcessEngine> engines = ProcessEngines.getProcessEngines();
getDefaultProcessEngine
用于返回key为default的ProcessEngine实例
registerProcessEngine方法
向ProcessEngines中注册一个实例
unregistered方法
将ProcessEngine实例从缓存Map中移除,但是不会close
retry方法
重新加载配置文件,创建一个ProcessEngine实例加入到Map中
destroy方法
对维护的所有的ProcessEngine实例进行销毁,会调用所有的close方法
ProcessEngine表示流程引擎对象
ProcessEngine processEngine = engineConfiguration.buildProcessEngine();
通过流程引擎对象可以获取所有的服务组件,通过其getXXXService获得
组件
RepositoryService repositoryService = processEngine.getRepositoryService();
提供一系列管理流程定义和流程部署的API
RuntimeService runtimeService = processEngine.getRuntimeService();
在运行时对流程实例进行管理和控制
TaskService taskService = processEngine.getTaskService();
对流程任务进行管理,如任务提醒、任务完成与创建
IdentityService identityService = processEngine.getIdentityService();
提供对流程角色数据进行管理的API
FormService formService = processEngine.getFormService();
activiti 7.x 取消了
ManagementService managementService = processEngine.getManagementService();
提供对流程引擎进行管理和维护的服务
DynamicBpmnService dynamicBpmnService = processEngine.getDynamicBpmnService();
可以不需要重新部署流程模型就可以对流程模型的部分修改
HistoryService historyService = processEngine.getHistoryService();
提供对流程历史数据的操作,查询和删除
查询对象
activiti提供了一系列的查询的API供开发者使用,可以使用各个服务组件的createXXXQuery方法来获取对应的查询对象
方法
排序
asc、desc
统计
count
集合
list
分页
listPage
单个对象
singleResult
如果查询多个会抛出异常
用户与用户组
IdentityService身份服务组件
提供了对Group实例和User实例操作的API
建议工作流只是作为流程的控制,涉及权限身份相关的可以有业务系统实现,故此处可以省略
用户组
对应数据表:ACT_ID_GROUP
实现类GroupEntityImpl
用户
对应数据表:ACT_ID_USER
实现类:UserEntityImpl
用户与用户组
关系表:ACT_ID_MEMBERRSIP
流程文件部署 Deployment
调用RepositoryService的API对定义的流程文件进行操作(包括添加、删除、查询等),这些文件会保存到ACT_GE_BYTEARRAY数据表中
Deployment是一个接口,一个Deployment实例表示一条部署数据
对应ACT_RE_DEPOYMENT表的一条数据
RepositoryService repositoryService = processEngine.getRepositoryService(); Deployment deployment = repositoryService.createDeployment().addClasspathResource("流程定义文件").deploy();
实现类:DeploymentEntityImpl
id
执行流程部署ID
name
部署名称
DeploymentBuilder部署对象
DeploymentBuilder builder = repositoryService.createDeployment();
添加输入流资源
InputStream
添加classpath资源
deploymentBuilder.addClasspathResource("xx.bpmn")
推荐
添加字符串资源
添加压缩包资源
添加BPMN模型资源
通过构建一个BPMN模型对象(Java代码方式实现流程图)
默认启动的时候会将classpath目录下process下定义的流程文件都会部署
执行部署(写入数据库)
builder.deploy();
过滤重复部署
builder.enableDuplicateFiltering();
该方法会将isDuplicateFilterEnabled设置为true,在执行deploy方法时会查找最后一次部署的记录,如果发现记录一样(部署的资源名称、内容是否相同)则不会重复部署
部署校验
默认情况下部署的时候会校验是否BPMN规范,定义的流程是否可执行
builder.disableBpmnValidation(); builder.disableSchemaValidation();
可以通过两个设置取消校验
DeploymentQuery对象
DeploymentQuery deploymentQuery = repositoryService.createDeploymentQuery();
对部署的流程数据查询
流程定义 ProcessDefinition
ProcessDefinition对象是一个接口, 一个ProcessDefinition对象实例表示一条流程定义数据
对应ACT_RE_PROCDEF表
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).singleResult();
所谓的流程部署即是将上传的流程文件,解析保存到数据库中,根据解析的数据生成一条流程定义的数据
实现类:ProcessDefinitionEntityImpl
API
getId
返回流程定义的主键ID
getCategory
返回流程定义的category属性
getName
返回流程定义显示的名称
getKey
返回流程定义的名称,唯一
getDescription
返回定义描述
getVersion
返回定义的版本号
getDeploymentId
返回流程部署的ID
getDiagramResourceName
返回流程定义的png图片
中止、激活
只是一种状态的控制
流程一旦部署成功就是激活状态
流程缓存
为提高查询效率,会在解析完流程定义文件会,将流程定义缓存到一个Map中,key为流程定义的ID
流程定义权限
对应数据表:ACT_RU_IDENTITYLINK
用于保存用户组、用户和流程任务节点之间关系
通过方法添加:repositoryService.addCandidateStarterGroup(processDefinition.getId(), "group ID"); 或者repositoryService.addCandidateStarterUser(processDefinition.getId(), "user ID");
所谓的保存的流程权限数据,activiti工作流并不会做拦截,只是提供了相关的查询,由开发者自己根据业务处理。
ProcessDefinitionQuery对象
查询流程定义的数据
IdentityLink对象
一个IdentityLink实例对象表示一种身份(包括用户和用户组)和流程数据的绑定关系
实现类:IdentityLinkEntityImpl
RepositoryService 数据查询与删除
查询部署资源
使用DeploymentBuilder的addXXX方法将相关的资源文件部署保存到数据库中后,可以根据部署ID和资源名称,就可以返回部署资源的输入流对象
InputStream getResourceAsStream(String deploymentId, String resourceName)
查询部署的资源名称: List<String> getDeploymentResourceNames(String deploymentId)
查询流程文件
InputStream getProcessModel(String processDefinitionId)
查询流程图
InputStream getProcessDiagram(String processDefinitionId) BufferedImage image = ImageIO.read(inputStream);
可以将流程图输出展示到前端页面
删除部署资源
void deleteDeployment(String deploymentId)
删除部署数据,不进行级联删除,所谓级联删除就是删除与改部署相关的流程实例数据
void deleteDeployment(String deploymentId, boolean cascade)
cascade参数为false等同于上面
cascade参数为true,表示会级联删除
不管是否级联删除,都会删除包括身份数据、流程定义数据、流程资源、部署数据
如果设置为级联删除,则会删除流程实例数据,也包括任务与流程实例的历史数据; 如果设置为false,如果已经存在了流程实例数据,那么将会删除失败
任务 Task
一个Task实例表示流程中的一个任务
对应数据表:ACT_RU_TASK
实现类TaskEntityImpl
id
任务ID
owner
任务拥有者
assignee
任务代理人,表示指定的执行任务的人
executionId
任务对应的执行流ID
processDefinitionId
任务对应的流程定义ID,对应的PROC_DEF_ID_字段
TaskService
可以实现任务的创建、删除
任务权限
对应数据表:ACT_RU_IDENTITYLINK
该表对应IdentityLink对象
TYPE_字段为“cadidate”,表示该任务手权限控制
设置候选组
void addCandidateGroup(String taskId, String groupId)
设置候选用户
void addCandidateUser(String taskId, String userId)
权限数据查询
添加任务权限
设置任务持有人
void setOwner(String taskId, String userId)
设置任务代理人
void setAssignee(String taskId, String userId)
该方法可以多次设置
任务参数
对应数据表:ACT_RU_AVRIABLE
作用域
setVariable
表示可以在整个流程中使用
setVariableLocal
在当前任务中使用
任务声明
调用TaskService的claim方法,将任务分配到指定用户名下,即用户作为任务代理人
与setAssignee不同的是,这个只能领取分配一次,再次会抛异常
任务完成
调用TaskService的complete方法
流程控制
流程实例与执行流
在activiti中,启动一个流程,会创建一个流程实例,每个流程实例至少有一个执行流(分支)
ProcessInstance是一个接口,一个ProcessInstance表示一个流程实例,是执行流Execution的子接口
ProcessInstance中扩展了Execution的属性,比如流程定义和业务主键
对应数据表:ACT_RU_EXEUTION
通过RuntimeService服务组件发起相应操作
启动流程
runtimeService.startProcessInstanceByXXX方法,返回一个流程实例对象
runtimeService.startProcessInstanceByKey("流程图中的ID")
ProcessInstance startProcessInstanceByKey(String processDefinitionKey, String businessKey, Map<String, Object> variables)
流程参数
void setVariable(String executionId, String variableName, Object value)
流程触发
当流程中有等待节点(receive Task)时候可以trigger方法触发,使其继续往下走
void trigger(String executionId)
void trigger(String executionId, Map<String, Object> processVariables)
void trigger(String executionId, Map<String, Object> processVariables, Map<String, Object> transientVariables)
中断和激活
只是一种状态表示,流程表中的SUSPENSION_STATE_字段来保存,1表示激活,2表示中断
void activateProcessInstanceById(String processInstanceId)
void suspendProcessInstanceById(String processInstanceId)
流程数据查询
执行流查询
RuntimeService的createExecutionQuery方法获得一个ExecutionQuery对象
流程实例查询
RuntimeService的createProcessInstanceQuery方法获取一个ProcessInstanceQuery实例
历史数据
对应数据表为:ACT_HI_XXX 例如:ACT_HI_TASKINST
通过HistoryService的createHistoricXXXInstanceQuery方法获取对应的查询对象
历史流程数据
对应数据表:ACT_HI_PROCINST
HistoricProcessInstanceQuery createHistoricProcessInstanceQuery()
历史任务查询
对应数据表:ACT_HI_TASKINST
HistoricTaskInstanceQuery createHistoricTaskInstanceQuery()
历史行为查询
对应数据表:ACT_HI_ACTINST
用于记录流程节点的ID、名称、类型、操作时间等
HistoricActivityInstanceQuery createHistoricActivityInstanceQuery()
历史流程明细查询
当activiti的history级别为full时才会记录明细数据
对应数据表:ACT_HI_DETAIL
删除历史流程实例和历史任务
删除历史流程实例和历史任务的时候,会将关联的数据一并删除,如参数、明细、行为等
删除是,如果一个流程实例没有完成,在调用删除方法时,将会抛出异常