flowable流程结束事件响应监听器

有两种方案,一种不用监听器:

1、获取下一个任务节点是不是结束事件

/**
 * 获取任务节点
 *
 * @param node   查询节点选择
 * @param taskId 任务id
 */
public void nextFlowNode(String node, String taskId) {
    Task task = processEngine().getTaskService().createTaskQuery().taskId(taskId).singleResult();
    ExecutionEntity ee = (ExecutionEntity) processEngine().getRuntimeService().createExecutionQuery()
            .executionId(task.getExecutionId()).singleResult();
    // 当前审批节点
    String crruentActivityId = ee.getActivityId();
    BpmnModel bpmnModel = processEngine().getRepositoryService().getBpmnModel(task.getProcessDefinitionId());
    FlowNode flowNode = (FlowNode) bpmnModel.getFlowElement(crruentActivityId);
    // 输出连线
    List<SequenceFlow> outFlows = flowNode.getOutgoingFlows();
    for (SequenceFlow sequenceFlow : outFlows) {
        //当前审批节点
        if ("now".equals(node)) {
            FlowElement sourceFlowElement = sequenceFlow.getSourceFlowElement();
            System.out.println("当前节点: id=" + sourceFlowElement.getId() + ",name=" + sourceFlowElement.getName());
        } else if ("next".equals(node)) {
            // 下一个审批节点
            FlowElement targetFlow = sequenceFlow.getTargetFlowElement();
            if (targetFlow instanceof UserTask) {
                System.out.println("下一节点: id=" + targetFlow.getId() + ",name=" + targetFlow.getName());
            }
            // 如果下个审批节点为结束节点
            if (targetFlow instanceof EndEvent) {
                System.out.println("下一节点为结束节点:id=" + targetFlow.getId() + ",name=" + targetFlow.getName());
            }
        }


    }
}
--------------------- 
版权声明:本文为CSDN博主「FYRT」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_36760953/article/details/91410038

2、第二种方法:实现监听器,生成监听器的bean类,写在model生成的xml文件中

监听器类:

@Component(value = "myListener")
public class TaskBusinessCallListener extends BusinessCallListener implements TaskListener {
    /**
     * dubbo的类名
     */
    private FixedValue clazzName;
    /**
     * 方法名
     */
    private FixedValue method;
    /**
     * 版本号
     */
    private FixedValue version;
    /**
     * 参数 多个的话用分号隔开 实例 userCode:00004737;status:1
     */
    private FixedValue params;

    @Override
    public void notify(DelegateTask delegateTask) {
        String processInstanceId = delegateTask.getProcessInstanceId();
        //执行回调
        this.callBack(processInstanceId, clazzName.getExpressionText(), method.getExpressionText(), version.getExpressionText(), params.getExpressionText());
    }
}

在xml文件中使用delegateExpression表达式

<userTask id="test" name="测试" flowable:assignee="${applyUserId}" flowable:formKey="testForm">
      <extensionElements>
        <!-- <flowable:taskListener event="create" class="cn.flowable.listener.MyListener"></flowable:taskListener> -->
        <flowable:taskListener event="create" delegateExpression="${myListener}"></flowable:taskListener>
        <modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
      </extensionElements>
    </userTask>
--------------------- 
版权声明:本文为CSDN博主「仰望星空的女孩」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u011396199/article/details/76174466

上述方法实际上 不能实现流程结束后进行响应操作,这里的监听器应该加在结束事件上

3、那么有没有方法可以实现直接在bpmnModel上添加全局的结束事件监听器呢?

思路是 创建一个自定义的全局监听器,添加进flowable的监听器序列中去,然后在这个自定义的全局监听器的方法中判断当前的Event是不是EndEvent,如果是才进行相应的操作。
自定义全局监听器:

/**
 * 任务节点前置监听处理类
 * @author: Lu Yang
 * @create: 2019-05-04 20:51
 **/
@Component
public class TaskBeforeListener implements FlowableEventListener {

    @Override
    public void onEvent(FlowableEvent event) {

        // 当前节点任务实体
        TaskEntity taskEntity = (TaskEntity) ((FlowableEntityEventImpl) event).getEntity();
        // TODO 获取到了taskEntity 自己做每个节点的前置操作

    }

    @Override
    public boolean isFailOnException() {
        return false;
    }

    @Override
    public boolean isFireOnTransactionLifecycleEvent() {
        return false;
    }

    @Override
    public String getOnTransaction() {
        return null;
    }
}
//引自:[https://www.jianshu.com/p/5d673e767356](https://www.jianshu.com/p/5d673e767356)

需要对这个全局监听器进行配置,纳入flowable监听

/**
 * flowable 全局监听器配置类
 * @author: Lu Yang
 */
@Configuration
public class FlowableListenerConfig {

    // flowable监听级别参照 {@link FlowableEngineEventType} org.flowable.common.engine.api.delegate.event
    /**
     * 任务节点前置监听
     */
    private static final String FLOWABLE_TASK_NODE_REAR_LISTENER = "TASK_COMPLETED";

    // 自己建立监听类实现FlowableEventListener接口
    /**
     * 任务节点前置监听
     */
    private final TaskBeforeListener taskBeforeListener;


    @Autowired
    public FlowableListenerConfig(TaskBeforeListener taskBeforeListener) {
        this.taskBeforeListener = taskBeforeListener;
    }

    /**
     * 将自定义监听器纳入flowable监听
     * @author: Lu Yang
     * @date: 2019/5/4 21:05
     * @param
     * @return org.flowable.spring.boot.EngineConfigurationConfigurer<org.flowable.spring.SpringProcessEngineConfiguration>
     */
    @Bean
    public EngineConfigurationConfigurer<SpringProcessEngineConfiguration> globalListenerConfigurer () {
        return engineConfiguration -> {
            engineConfiguration.setTypedEventListeners(this.customFlowableListeners());
        };
    }

    /**
     * 监听类配置 {@link FlowableEngineEventType} flowable监听器级别
     * @author: Lu Yang
     * @date: 2019/5/4 20:58
     * @param
     * @return java.util.Map<java.lang.String,java.util.List<org.flowable.common.engine.api.delegate.event.FlowableEventListener>>
     */
    private Map<String, List<FlowableEventListener>> customFlowableListeners () {
        Map<String, List<FlowableEventListener>> listenerMap = Maps.newHashMap();
        listenerMap.put(FLOWABLE_TASK_NODE_BEFORE_LISTENER, new ArrayList<>(Collections.singletonList(getTaskBeforeListener())));
    }

    public TaskBeforeListener getTaskBeforeListener() {
        return taskBeforeListener;
    }
}
//引自:[https://www.jianshu.com/p/5d673e767356](https://www.jianshu.com/p/5d673e767356)

但是上述这个方法其实是有问题的,结束事件“执行”时,是不会调用这里的onEvent方法的!最后一个userEvent执行完毕之后,这个流程就相当于自动结束了!
所以得在执行最后一个userEvent的时候就要进行处理,所以综合方法1和方法3,最终的全局监听器这么写:

/**
 * 全局监听器,判断流程是不是运行到了最后一个EndEvent
 * @author: YBY
 * @create: 2019-05-04 20:51
 **/
@Component
public class ProcessEndListener implements FlowableEventListener {

    @Autowired
    FlowableService flowableService;

    @Override
    public void onEvent(FlowableEvent event) {
        // 当前节点任务实体,
        TaskEntity taskEntity = (TaskEntity) ((FlowableEntityEventImpl) event).getEntity();
        String taskId = taskEntity.getId();
        String curActId = flowableService.getNodeId(taskId);
        String procDefId = ProcUtils.getProcessDefinitionByTaskId(taskEntity.getId()).getId();
        Process process = ProcessDefinitionUtil.getProcess(procDefId);
        //遍历整个process,找到endEventId是什么,与当前taskId作对比
        List<FlowElement> flowElements = (List<FlowElement>) process.getFlowElements();
        for (FlowElement flowElement : flowElements) {
            if (flowElement instanceof SequenceFlow) {
                SequenceFlow flow = (SequenceFlow) flowElement;
                FlowElement sourceFlowElement = flow.getSourceFlowElement();
                FlowElement targetFlowElement = flow.getTargetFlowElement();
                //如果当前边的下一个节点是endEvent,那么获取当前边
                if(targetFlowElement instanceof EndEvent && sourceFlowElement.getId().equals(curActId))
                {
                    System.out.println("下一个是结束节点!!");
                }
            }
        }
    }

    @Override
    public boolean isFailOnException() {
        return false;
    }

    @Override
    public boolean isFireOnTransactionLifecycleEvent() {
        return false;
    }

    @Override
    public String getOnTransaction() {
        return null;
    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,063评论 6 510
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,805评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,403评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,110评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,130评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,877评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,533评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,429评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,947评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,078评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,204评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,894评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,546评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,086评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,195评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,519评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,198评论 2 357