# 流程全局触发事件扩展
流程平台在流程设计时可以通过流程设计器为流程、活动分别配置触发事件拦截扩展。然而在某些特殊场景下,需要对整个平台或应用的所有流程进行统一拦截处理,如果通过在线分别配置的方式效率比较低。因此流程平台提供了全局触发事件扩展点,可以采用二次扩展开发的方式,支持全局或应用内部流程、活动的统一触发事件拦截。扩展方式说明如下:
# 接口列表
| 接口描述 | 接口全名 | 
|---|---|
| 流程触发事件监听 | com.primeton.workflow.engine.scheduler.spi.TriggerEventListener | 
| 全局触发事件标记 | com.primeton.workflow.engine.scheduler.spi.Global | 
# 开发依赖包
<dependency>
    <groupId>com.primeton.bps</groupId>
    <artifactId>bps-server-engine-scheduler</artifactId>
    <version>${bps.version}</version>
</dependency>
# 开发说明
- 选择触发事件类型,bps种的全局触发事件类型如下所示,选择需要的类型后再开发触发器 - 触发事件类型 - 触发事件描述 - 活动触发事件 - ActivityAfterFinishTriggerEvent - 活动完成后 - ActivityAfterResumeTriggerEvent - 活动恢复后 - ActivityAfterStartTriggerEvent - 活动重启后 - ActivityAfterSuspendTriggerEvent - 活动挂起后 - ActivityBeforeFinishTriggerEvent - 活动完成前 - ActivityBeforeStartTriggerEvent - 活动启动前 - 流程触发事件 - ProcessAfterFinishTriggerEvent - 流程完成后 - ProcessAfterRemindTriggerEvent - 流程提醒后 - ProcessAfterResumeTriggerEvent - 流程恢复后 - ProcessAfterStartTriggerEvent - 流程启动后 - ProcessAfterSuspendTriggerEvent - 流程挂起后 - ProcessAfterTimeoutTriggerEvent - 流程超时后 - ProcessBeforeFinishTriggerEvent - 流程完成前 - ProcessBeforeStartTriggerEvent - 流程启动前 - 工作项触发事件 - WorkItemAfterAssistTriggerEvent - 工作项协办后 - WorkItemAfterCancelTriggerEvent - 工作项取消领取后 - WorkItemAfterCreateTriggerEvent - 工作项创建后 - WorkItemAfterFinishedTriggerEvent - 工作项完成后 - WorkItemAfterGetTriggerEvent - 工作项领取后 - WorkItemAfterHandOverTriggerEvent - 工作项代办后 - WorkItemAfterPressTriggerEvent - 工作项催办后 - WorkItemAfterRemindTriggerEvent - 工作项提醒后 - WorkItemAfterRestartTriggerEvent - 工作项重启后 - WorkItemAfterResumeTriggerEvent - 工作项恢复后 - WorkItemAfterSignatureTriggerEvent - 工作项加签后 - WorkItemAfterSuspendTriggerEvent - 工作项挂起后 - WorkItemAfterTerminateTriggerEvent - 工作项终止后 - WorkItemAfterTimeoutTriggerEvent - 工作项超时后 - WorkItemBeforeFinishTriggerEvent - 工作项完成前 
- 实现com.primeton.workflow.engine.scheduler.spi.TriggerEventListener、com.primeton.workflow.engine.scheduler.spi.Global两个接口 
- onTriggerEvent方法中实现事件操作 
- 在项目resource/META-INF目录下创建 com.primeton.workflow.engine.scheduler.spi.TriggerEventListener文件,文件中按行填写触发器全路径,例如:com.primeton.workflow.engine.scheduler.spi.event.message.MessageCenterWorkItemAfterCreateEventListener;isGlobal=true; 
- 触发事件中如何获取流程相关信息方法 - 获取当前工作项:在onTriggerEvent中使用事件参数,通过event.getContext().getCurrentWorkItem();获取当前工作项
- 获取当前活动的所有工作项:WFServiceFactory.getService(IWFInstancePool.class).findActivityInstanceByID(actInstId).getActivityInstContext().findAllWorkItems();actInstId可以从当前工作项获取
- 获取相关数据:WFServiceFactory.getService(IWFInstancePool.class).findProcessInstanceByID(processInstId).getProcessInstContext().getRelativeDataContextEntity().get(xpath);其中processInstId可从当前工作项获取。还可以通过事件参数 event.getContext().getRelativeData(xpath),xpath为相关数据的xpath路径
- 获取活动实例:在onTriggerEvent中使用事件参数,通过event.getContext().getCurrentActivityInst();获取活动实例
- 获取参与者:获取当前工作项后,通过工作项的getParticipants()方法获取参与者
 
# 开发例子
- 创建普通的Java、maven项目(不是springboot项目),项目结构如下 - └─src └─main ├─java │ └─com │ └─bps │ └─trigger │ TestTrigger.java │ └─resources └─META-INF com.primeton.workflow.engine.scheduler.spi.TriggerEventListener
- pom中增加依赖(bps.version具体值取决于依赖bps的版本) - <dependency> <groupId>com.primeton.bps</groupId> <artifactId>bps-server-engine-scheduler</artifactId> <version>${bps.version}</version> </dependency>
- 创建触发器类,例如 - package com.bps.trigger; import com.primeton.workflow.engine.scheduler.spi.Global; import com.primeton.workflow.engine.scheduler.spi.TriggerEventListener; import com.primeton.workflow.engine.scheduler.spi.event.WorkItemAfterFinishedTriggerEvent; /** * 这里创建了一个在工作项完成后的全局触发事件 */ public class TestTrigger implements TriggerEventListener<WorkItemAfterFinishedTriggerEvent>, Global { @Override public void onTriggerEvent(WorkItemAfterFinishedTriggerEvent workItemAfterFinishedTriggerEvent) { //todo do something //当事件触发时,在这里做触发逻辑 } }
- 修改src\main\resources\META-INF\com.primeton.workflow.engine.scheduler.spi.TriggerEventListener文件 
- 完成后使用mvn install命令打成jar包,然后放到bps的lib目录下,重启bps即可