Activiti学习之监听器

本文介绍Activiti工作流引擎中的监听器概念及其使用方法。监听器作为业务与流程的粘合剂,在流程启动、结束及任务创建、完成时触发特定操作。通过示例展示了如何在流程定义中配置监听器,并提供了监听器接口与实现类代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

监听器是Activiti在BPMN 2.0规范基础上扩展的功能,是业务与流程的“非侵入性粘合剂”。在Activiti中开发人员可以通过配置监听器的方式监听各种动作,若流程的启动和结束,任务的创建和完成,某个顺序流的经过等。
监听器分为两种:
- 执行监听器
- 任务监听器
执行监听器主要功能为监听流程的启动、结束和节点连接线的流经。
任务监听器主要是对任务创建和完成的监控。
监听器事件主要分为三种:
- start(开始事件)
- end(结束事件)
- take(捕获事件)
下面通过代码实例来学习监听器,下面所有的代码均在spring boot框架下编写。


1、绘制流程图

新建一个流程图,该流程图包含开始、系统任务、结束三个节点,分别给三个节点设置监听器

流程开始节点
这里写图片描述

系统任务节点
这里写图片描述

流程结束节点
这里写图片描述

给系统任务设置执行方法
这里写图片描述

流程图XML代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
  <process id="listenerProcess" name="Listener Process" isExecutable="true">
    <startEvent id="startevent1" name="Start">
      <extensionElements>
        <activiti:executionListener event="start" expression="${listenerService.start()}"></activiti:executionListener>
      </extensionElements>
    </startEvent>
    <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="servicetask1"></sequenceFlow>
    <endEvent id="endevent1" name="End">
      <extensionElements>
        <activiti:executionListener event="end" expression="${listenerService.end()}"></activiti:executionListener>
      </extensionElements>
    </endEvent>
    <sequenceFlow id="flow2" sourceRef="servicetask1" targetRef="endevent1"></sequenceFlow>
    <serviceTask id="servicetask1" name="User Task" activiti:expression="${resumeService.storeResume()}">
      <extensionElements>
        <activiti:executionListener event="start" expression="${listenerService.taskStart()}"></activiti:executionListener>
        <activiti:executionListener event="end" expression="${listenerService.taskEnd()}"></activiti:executionListener>
      </extensionElements>
    </serviceTask>
  </process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_myProcess">
    <bpmndi:BPMNPlane bpmnElement="listenerProcess" id="BPMNPlane_myProcess">
      <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
        <omgdc:Bounds height="35.0" width="35.0" x="150.0" y="190.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
        <omgdc:Bounds height="35.0" width="35.0" x="380.0" y="190.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="servicetask1" id="BPMNShape_servicetask1">
        <omgdc:Bounds height="55.0" width="105.0" x="230.0" y="180.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
        <omgdi:waypoint x="185.0" y="207.0"></omgdi:waypoint>
        <omgdi:waypoint x="230.0" y="207.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
        <omgdi:waypoint x="335.0" y="207.0"></omgdi:waypoint>
        <omgdi:waypoint x="380.0" y="207.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</definitions>

2、编写代码

监听器接口代码如下

public interface ListenerService {
    void start();

    void end();

    void taskStart();

    void taskEnd();

    void taskExecute();
}

监听器实现类代码如下

@Service("listenerService")
public class ListenerServiceImpl implements ListenerService {

    /**
     * 流程开始
     */
    @Override
    public void start() {
        System.out.println("Activiti监听器:流程开始...................................");
    }

    /**
     * 流程结束
     */
    @Override
    public void end() {
        System.out.println("Activiti监听器:流程结束...................................");
    }

    /**
     * 任务开始
     */
    @Override
    public void taskStart() {
        System.out.println("Activiti监听器:任务开始...................................");
    }

    /**
     * 任务结束
     */
    @Override
    public void taskEnd() {
        System.out.println("Activiti监听器:任务结束...................................");
    }

    /**
     * 任务执行
     */
    @Override
    public void taskExecute() {
        System.out.println("Activiti系统任务:任务执行...................................");
    }
}

3、编写单元测试

单元测试类代码如下:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = SpringBootActivitiApplication.class)
public class ListenerTest {
    @Autowired
    RuntimeService runtimeService;

    /**
     * 启动流程
     */
    @Test
    public void testStartProcess() {
        runtimeService.startProcessInstanceByKey("listenerProcess");
    }
}

4、执行结果

这里写图片描述

### Activiti任务监听器中断的原因分析 Activiti中的任务监听器(Task Listener)主要用于监控和响应任务生命周期的不同阶段,例如创建、分配、完成等。如果发生任务监听器中断的情况,可能由以下几个原因引起: 1. **边界事件触发导致的任务终止** 当使用边界事件时,通常会配置一个中断标志,默认情况下该标志处于启用状态。这意味着一旦满足边界事件的触发条件,当前任务会被主动终止,并激活边界事件关联的任务及其后续流程[^2]。 2. **事件网关后的流程设计限制** 如果在事件网关之后的设计不符合规范,则可能导致流程异常或任务监听器无法正常执行。例如,事件网关后仅允许连接`intermediateCatchEvent`类型的节点,而不支持直接连接`ReceiveTask`[^1]。 3. **代码逻辑错误** 任务监听器本身可能存在编码问题,例如未正确处理异常情况或者存在死循环等问题,这也会导致监听器中断。 4. **外部因素干扰** 外部环境的变化也可能影响到任务监听器的行为,比如数据库连接超时、事务管理不当或其他依赖服务不可用等情况。 --- ### 解决方案 针对上述可能的原因,可以采取以下措施来解决问题并优化流程设计: #### 1. 调整边界事件设置 如果是因为边界事件引发的任务终止现象,可以通过修改边界事件的相关属性来进行控制。具体来说,在定义边界事件时可以选择关闭其默认的中断行为,从而保留原任务继续运行的同时启动新的分支流程。 #### 2. 验证事件网关下游结构合规性 确保遵循Activiti对于事件网关使用的约束条件——即确认所有从事件网关出发的路径均指向合法的目标节点类型(`intermediateCatchEvent`),避免非法组件(如`ReceiveTask`)的存在扰乱正常的业务流转过程。 #### 3. 加强任务监听器健壮性 编写更加稳健的任务监听器实现方法,增加必要的输入参数校验以及异常捕捉机制,防止由于内部缺陷造成的服务崩溃风险。以下是增强版Java示例代码片段展示如何安全地操作任务对象: ```java public class SafeTaskListener implements TaskListener { @Override public void notify(DelegateTask delegateTask) { try { String taskId = delegateTask.getId(); System.out.println("Processing task with ID: " + taskId); // Your custom logic here... } catch (Exception e) { log.error("Error occurred while processing task.", e); throw new RuntimeException(e); // Re-throw exception to ensure it's handled properly. } } } ``` 此段程序通过try-catch语句包裹核心功能部分,即使遇到意外状况也能及时记录日志并向调用方反馈确切的信息以便进一步排查根本原因。 #### 4. 提升系统稳定性 定期审查整个工作流引擎所处的技术栈是否存在潜在隐患,包括但不限于升级至最新稳定版本框架库文件减少已知漏洞暴露概率;合理规划资源配额预防过载情形下性能下降甚至宕机事故的发生等等。 --- ### 总结说明 综上所述,解决Activiti任务监听器中断的关键在于全面审视各个环节可能出现的问题源,并针对性实施改进策略。无论是调整模型设定还是完善编程实践都能有效降低此类故障发生的几率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值