本文个人博客地址:Activiti7事件监听 (leafage.top)
好久没有记录笔记了,最近做了一些关于工作流的事情,记录一下使用activiti 7的一些经验。
需求:
- 在流程发起和流程操作的过程中,给相关人员发送流程审批的通知提醒;
- 不要在配置流程时手动添加,不能侵入到流程操作的过程,影响流程执行;
这个怎么入手呢?没搞过activiti,activiti7 的官方文档写的跟屎一样烂,感觉好难呀😔…
文档参考性不高,那就试试看官方的示例,找到 activiti 的 repository ,有一个示例 module 叫 activiti-examples,这里的示例不能直接跑,只能看,要想跑起来,就复制,粘贴,放到自己的项目中。跑题了,说会主题。。。
activiti中的几个关联的重要的类或接口:
-
activiti 中每个流程信息是通过 ProcessInstance 描述,它有这么几个状态:created、started、completed、cancelled、resumed、updated、suspended,与之对应的相关事件描述类是:ProcessCreatedEvent、ProcessStartedEvent、ProcessCompletedEvent、ProcessCancelledEvent、ProcessResumedEvent、ProcessUpdatedEvent、ProcessSuspendedEvent等。
-
每个流程节点在 activiti 中 通过 Task 来描述,它有这么几个个状态:created、assigned、completed、updated、cancelled、suspended等,与之对应的相关事件描述类是:TaskCreatedEvent、TaskAssignedEvent、TaskCompletedEvent、TaskUpdatedEvent、TaskCancelledEvent、TaskSuspendedEvent等。
如何配置监听器?
1. 全局事件监听器:
涉及到两个类\接口,全局事件监听器 ActivitiEventListener 和 ProcessEngineConfigurationConfigurer(有一个默认的实现类:DefaultActivityBehaviorFactoryMappingConfigurer)
ActitiviEventListener 接口有一个 void onEvent(ActivitiEvent activitiEvent) 方法,即在事件状态发生变化时,可以发生的动作都会在这个方法中进行。其源码如下:
/**
* Describes a class that listens for {@link ActivitiEvent}s dispatched by the engine.
*
*/
public interface ActivitiEventListener {
void onEvent(ActivitiEvent event);
boolean isFailOnException();
}
ActivitiEvent 包含了流程的定义ID,示例ID,执行ID,和事件类型信息,源码如下:
public interface ActivitiEvent {
ActivitiEventType getType();
String getExecutionId();
String getProcessInstanceId();
String getProcessDefinitionId();
}
其事件类型包括很多,源码如下:
public enum ActivitiEventType {
// ENTITY :流程实例,发起流程时,从流程模板中创建实例
ENTITY_CREATED, // 创建
ENTITY_INITIALIZED, // 初始化完成(如果这个实体的创建会包含子实体的创建,这个事件会在子实体都创建/初始化完成后被触发,这是与ENTITY_CREATED的区别)
ENTITY_UPDATED, // 更新
ENTITY_DELETED, // 删除
ENTITY_SUSPENDED, // 暂停(会被ProcessDefinitions, ProcessInstances 和 Tasks抛出)
ENTITY_ACTIVATED, // 激活(会被ProcessDefinitions, ProcessInstances 和 Tasks抛出)
// 定时器
TIMER_SCHEDULED, // 创建
TIMER_FIRED, // 触发
// 作业
JOB_CANCELED, // 取消
JOB_EXECUTION_SUCCESS, // 执行成功
JOB_EXECUTION_FAILURE, // 执行失败
JOB_RETRIES_DECREMENTED, // 重试减少(因为作业执行失败,导致重试次数减少)
CUSTOM, // 自定义
// 引擎
ENGINE_CREATED, // 创建
ENGINE_CLOSED, // 关闭
// 流程节点
ACTIVITY_STARTED, // 开始
ACTIVITY_COMPLETED, // 完成
ACTIVITY_CANCELLED, // 取消
ACTIVITY_SIGNALED, // 收到了一个信号
ACTIVITY_COMPENSATE, // 将要被补偿
ACTIVITY_MESSAGE_SENT, // 消息发送
ACTIVITY_MESSAGE_WAITING, // 消息等待
ACTIVITY_MESSAGE_RECEIVED, // 消息接收
ACTIVITY_ERROR_RECEIVED, // 接收失败
// 流程历史
HISTORIC_ACTIVITY_INSTANCE_CREATED, // 创建
HISTORIC_ACTIVITY_INSTANCE_ENDED, // 结束
// 队列流程
SEQUENCEFLOW_TAKEN, // 已采取
UNCAUGHT_BPMN_ERROR, // 未获取到bpmn 异常
// 变量
VARIABLE_CREATED, // 创建
VARIABLE_UPDATED, // 更新
VARIABLE_DELETED, // 删除
// 任务
TASK_CREATED, // 创建(它位于ENTITY_CREATE事件之后。当任务是由流程创建时,这个事件会在TaskListener执行之前被执行)
TASK_ASSIGNED, // 分配
TASK_COMPLETED, // 完成(它会在ENTITY_DELETE事件之前触发。当任务是流程一部分时,事件会在流程继续运行之前, 后续事件将是ACTIVITY_COMPLETE,对应着完成任务的节点)
// 进程
PROCESS_STARTED, // 开始
PROCESS_COMPLETED, // 完成(在最后一个节点的ACTIVITY_COMPLETED事件之后触发。 当流程到达的状态,没有任何后续连线时, 流程就会结束。)
PROCESS_COMPLETED_WITH_ERROR_END_EVENT, // 异常结束
PROCESS_CANCELLED, // 取消
HISTORIC_PROCESS_INSTANCE_CREATED, // 流程实例创建
HISTORIC_PROCESS_INSTANCE_ENDED, // 流程实例创建
// 成员
MEMBERSHIP_CREATED, // 用户被添加到一个组里
MEMBERSHIP_DELETED, // 用户被从一个组中删除
MEMBERSHIPS_DELETED; // 所有成员被从一个组中删除
// other code ...
}
ProcessEngineConfigurationConfigurer 中的 void configure(SpringProcessEngineConfiguration springProcessEngineConfiguration) 方法可以添加自定义的事件监听器,这个监听器作用域为整个流程过程。其源码如下:
public class DefaultActivityBehaviorFactoryMappingConfigurer implements ProcessEngineConfigurationConfigurer {
private VariablesMappingProvider variablesMappingProvider;
private ProcessVariablesInitiator processVariablesInitiator;
private final EventSubscriptionPayloadMappingProvider eventSubscriptionPayloadMappingProvider;
public DefaultActivityBehaviorFactoryMappingConfigurer(VariablesMappingProvider variablesMappingProvider,
ProcessVariablesInitiator processVariablesInitiator,
EventSubscriptionPayloadMappingProvider eventSubscription