【Flowable】任务监听器(五)

前言

之前有需要使用到Flowable,鉴于网上的资料不是很多也不是很全也是捣鼓了半天,因此争取能在这里简单分享一下经验,帮助有需要的朋友,也非常欢迎大家指出不足的地方。

一、监听器

在Flowable中,我们可以使用监听器来完成很多流程业务,比如指定任务处理人、任务通知提醒等操作,在这里我们来简单尝试一下监听器的使用,我们在上篇文章中使用的请假流程中来创建监听器。

在这里插入图片描述
在这里插入图片描述
如上图所示:

  • 事件
    • create:任务创建的时候触发。
    • assignment:在分配处理人的时候触发。
    • complete:处理完成之后触发。
    • all:所有的行为都会触发

我们创建一下监听器:指定一下事件类型这里用create,其中org.flowable.TestTaskListener为自定义的一个java类
在这里插入图片描述
这里也提供了更新之后的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:xsd="http://www.w3.org/2001/XMLSchema" xmlns:flowable="http://flowable.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.flowable.org/processdef" exporter="Flowable Open Source Modeler" exporterVersion="6.7.2">
    <process id="MyHoliday" name="MyHoliday" isExecutable="true">
        <startEvent id="startEvent1" name="开始" flowable:formFieldValidation="true"></startEvent>
        <userTask id="sid-320C4AED-D9F4-4C53-B2B6-D4ACCBA155F5" name="直线审批" flowable:formFieldValidation="true">
            <extensionElements>
                <flowable:taskListener event="create" class="org.flowable.TestTaskListener"></flowable:taskListener>
            </extensionElements>
        </userTask>
        <sequenceFlow id="sid-422764E6-61F4-454A-BF08-9CF973E1E67D" sourceRef="startEvent1" targetRef="sid-320C4AED-D9F4-4C53-B2B6-D4ACCBA155F5"></sequenceFlow>
        <userTask id="sid-873E297E-9E6B-4F4E-AF6A-2E085F1806B1" name="部门审批" flowable:formFieldValidation="true">
            <extensionElements>
                <flowable:taskListener event="create" class="org.flowable.TestTaskListener"></flowable:taskListener>
            </extensionElements>
        </userTask>
        <sequenceFlow id="sid-A0869337-10D3-43BC-90C1-036C9719308E" sourceRef="sid-320C4AED-D9F4-4C53-B2B6-D4ACCBA155F5" targetRef="sid-873E297E-9E6B-4F4E-AF6A-2E085F1806B1"></sequenceFlow>
        <endEvent id="sid-CAB64925-F653-4167-8E12-ED956B723D2E" name="结束"></endEvent>
        <sequenceFlow id="sid-91D96B3A-3408-4504-A23D-8F0C2AFE19A7" sourceRef="sid-873E297E-9E6B-4F4E-AF6A-2E085F1806B1" targetRef="sid-CAB64925-F653-4167-8E12-ED956B723D2E"></sequenceFlow>
    </process>
    <bpmndi:BPMNDiagram id="BPMNDiagram_MyHoliday">
        <bpmndi:BPMNPlane bpmnElement="MyHoliday" id="BPMNPlane_MyHoliday">
            <bpmndi:BPMNShape bpmnElement="startEvent1" id="BPMNShape_startEvent1">
                <omgdc:Bounds height="30.0" width="30.0" x="89.99999731779107" y="149.99999552965178"></omgdc:Bounds>
            </bpmndi:BPMNShape>
            <bpmndi:BPMNShape bpmnElement="sid-320C4AED-D9F4-4C53-B2B6-D4ACCBA155F5" id="BPMNShape_sid-320C4AED-D9F4-4C53-B2B6-D4ACCBA155F5">
                <omgdc:Bounds height="80.0" width="100.00000000000003" x="164.99999731779107" y="124.99999552965178"></omgdc:Bounds>
            </bpmndi:BPMNShape>
            <bpmndi:BPMNShape bpmnElement="sid-873E297E-9E6B-4F4E-AF6A-2E085F1806B1" id="BPMNShape_sid-873E297E-9E6B-4F4E-AF6A-2E085F1806B1">
                <omgdc:Bounds height="80.00000000000001" width="100.0" x="299.99999105930357" y="119.99999642372141"></omgdc:Bounds>
            </bpmndi:BPMNShape>
            <bpmndi:BPMNShape bpmnElement="sid-CAB64925-F653-4167-8E12-ED956B723D2E" id="BPMNShape_sid-CAB64925-F653-4167-8E12-ED956B723D2E">
                <omgdc:Bounds height="28.0" width="28.0" x="464.9999861419205" y="145.9999920725826"></omgdc:Bounds>
            </bpmndi:BPMNShape>
            <bpmndi:BPMNEdge bpmnElement="sid-91D96B3A-3408-4504-A23D-8F0C2AFE19A7" id="BPMNEdge_sid-91D96B3A-3408-4504-A23D-8F0C2AFE19A7" flowable:sourceDockerX="50.0" flowable:sourceDockerY="40.00000000000001" flowable:targetDockerX="14.0" flowable:targetDockerY="14.0">
                <omgdi:waypoint x="399.94999034668683" y="159.99999473723344"></omgdi:waypoint>
                <omgdi:waypoint x="464.99998600932435" y="159.99999254311274"></omgdi:waypoint>
            </bpmndi:BPMNEdge>
            <bpmndi:BPMNEdge bpmnElement="sid-A0869337-10D3-43BC-90C1-036C9719308E" id="BPMNEdge_sid-A0869337-10D3-43BC-90C1-036C9719308E" flowable:sourceDockerX="50.000000000000014" flowable:sourceDockerY="40.0" flowable:targetDockerX="50.0" flowable:targetDockerY="40.00000000000001">
                <omgdi:waypoint x="264.9499973177909" y="163.1481439230865"></omgdi:waypoint>
                <omgdi:waypoint x="299.9999910593035" y="161.8499961786801"></omgdi:waypoint>
            </bpmndi:BPMNEdge>
            <bpmndi:BPMNEdge bpmnElement="sid-422764E6-61F4-454A-BF08-9CF973E1E67D" id="BPMNEdge_sid-422764E6-61F4-454A-BF08-9CF973E1E67D" flowable:sourceDockerX="15.0" flowable:sourceDockerY="15.0" flowable:targetDockerX="50.000000000000014" flowable:targetDockerY="40.0">
                <omgdi:waypoint x="119.94999580774865" y="164.99999552965178"></omgdi:waypoint>
                <omgdi:waypoint x="164.9999973177828" y="164.99999552965178"></omgdi:waypoint>
            </bpmndi:BPMNEdge>
        </bpmndi:BPMNPlane>
    </bpmndi:BPMNDiagram>
</definitions>

将此xml文件放置项目的资源目录下

二、创建监听类

package org.flowable;

import org.flowable.engine.delegate.TaskListener;
import org.flowable.task.service.delegate.DelegateTask;

/**
 * Author:hyy
 * Date:2023/9/15
 * Description:
 */
public class TestTaskListener implements TaskListener {
    @Override
    public void notify(DelegateTask delegateTask) {
        System.err.println("============= 监听器执行 ================= ");

        if("create".equals(delegateTask.getEventName()) ){
            System.out.println("你的业务操作....");
        }
    }
}

创建TestTaskListener实现TaskListener,我们发现这个方法的关键信息都是从DelegateTask中获取,name我们来看一下这个类

public interface DelegateTask extends VariableScope {

    //任务ID
    String getId();

  	//任务名称
    String getName();

   	
    void setName(String name);

  	//描述
    String getDescription();


    void setDescription(String description);

   	//优先级
    int getPriority();

    
    void setPriority(int priority);

    //实例ID
    String getProcessInstanceId();


    //流程定义ID
    String getProcessDefinitionId();

    
    Date getCreateTime();

	//任务主键
    String getTaskDefinitionKey();
	
  	//是否终断
    boolean isSuspended();

    //租户ID
    String getTenantId();

	//表单key
    String getFormKey();

   
    void setFormKey(String formKey);

   	//事件
    String getEventName();
	//....... 
}

三、重新部署流程

在上一篇文章示例中,我们在重新部署一下这个流程

   @Test
    public void testDeploy() {
        //1.获取ProcessEngine 对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //2.获取RepositoryService
        RepositoryService repositoryService = processEngine.getRepositoryService();
        //3.完成流程部署操作
        Deployment deploy = repositoryService.createDeployment()
                .addClasspathResource("MyHoliday.bpmn20.xml") //关联要部署的流程名称
                .name("请假流程")
                .deploy(); //部署流程


        System.out.println("id: " + deploy.getId()); 
        System.out.println("name: " + deploy.getName());
        System.out.println("key: " + deploy.getKey());

    }

这里去ACT_RE_PROCDEF中找到部署ID为代码打印的ID数据我这里是35001,拿到他的ID_字段MyHoliday:2:35004去启动流程
在这里插入图片描述

四、启动流程

@Test
    public void startTest() {
        ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();

        RuntimeService runtimeService = defaultProcessEngine.getRuntimeService();


        Map<String, Object> variables = new HashMap<>();


        variables.put("firstAssigne", "张三");
        variables.put("deptAssigne", "李四");

        ProcessInstance processInstance = runtimeService.startProcessInstanceById("MyHoliday:2:35004", variables);


        System.out.println("processInstance.getProcessInstanceId() = " + processInstance.getProcessInstanceId());
    }

发现控制台打印如下日志,表示监听器执行完成
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Flowable 是一个开源的工作流引擎,它可以帮助我们设计和执行各种类型的工作流程。在 Flowable 中,我们可以通过设置任务监听器来对任务的生命周期进行监听和处理。 要设置任务监听器,需要按照以下步骤进行操作: 1. 创建一个实现了 org.flowable.engine.delegate.TaskListener 接口的监听器类,该接口定义了任务监听器的回调方法。 2. 在该监听器类中,实现需要的任务生命周期回调方法,如 `notify` 方法。你可以根据自己的需求在这些方法中编写相应的逻辑。 3. 在流程定义文件(BPMN 文件)中,为任务节点添加监听器属性,并引用上一步创建的监听器类。 具体示例请参考以下代码: ```java import org.flowable.engine.delegate.DelegateTask; import org.flowable.engine.delegate.TaskListener; public class MyTaskListener implements TaskListener { @Override public void notify(DelegateTask delegateTask) { // 在这里编写任务生命周期回调时需要执行的逻辑 // 可以获取任务相关信息,如任务ID、任务名称、任务负责人等 // delegateTask.getId(); // delegateTask.getName(); // delegateTask.getAssignee(); } } ``` 然后,在流程定义文件的任务节点中添加监听器属性: ```xml <userTask id="task1" name="My Task" flowable:assignee="${assignee}"> <extensionElements> <flowable:taskListener event="create" expression="${myTaskListener}" /> </extensionElements> </userTask> ``` 在上述代码中,`${assignee}` 是一个表达式,用于设置任务的负责人。`${myTaskListener}` 是一个表达式,用于引用上面创建的监听器类。 这样,当流程执行到该任务节点时,任务监听器类中的相应方法将被调用,并可以执行你定义的逻辑。 希望以上信息对你有帮助!如有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈橙橙丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值