Flowable源码注释(四十六)任务相关的解析处理类

本文深入探讨Flowable流程引擎中任务相关的解析处理类,包括TaskParseHandler、UserTaskParseHandler、ServiceTaskParseHandler和SendTaskParseHandler。通过源码注释,详细解析每个处理类在流程实例执行过程中的作用。

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

Flowable源码地址:https://github.com/flowable/flowable-engine

Flowable-6.7.2 源码注释地址:https://github.com/solojin/flowable-6.7.2-annotated

任务相关的解析处理类,包路径:org.flowable.engine.impl.bpmn.parser.handler

TaskParseHandler 任务解析处理类

package org.flowable.engine.impl.bpmn.parser.handler;

import org.flowable.bpmn.model.BaseElement;
import org.flowable.bpmn.model.Task;
import org.flowable.engine.impl.bpmn.parser.BpmnParse;

/**
 * 任务解析处理器
 *
 * @author Joram Barrez
 */
public class TaskParseHandler extends AbstractActivityBpmnParseHandler<Task> {

    @Override
    public Class<? extends BaseElement> getHandledType() {
        return Task.class;
    }

    @Override
    protected void executeParse(BpmnParse bpmnParse, Task task) {
        task.setBehavior(bpmnParse.getActivityBehaviorFactory().createTaskActivityBehavior(task));
    }

}

UserTaskParseHandler 用户任务解析处理器

package org.flowable.engine.impl.bpmn.parser.handler;

import org.flowable.bpmn.model.BaseElement;
import org.flowable.bpmn.model.UserTask;
import org.flowable.engine.impl.bpmn.parser.BpmnParse;

/**
 * 用户任务解析处理器
 *
 * @author Joram Barrez
 */
public class UserTaskParseHandler extends AbstractActivityBpmnParseHandler<UserTask> {

    @Override
    public Class<? extends BaseElement> getHandledType() {
        return UserTask.class;
    }

    @Override
    protected void executeParse(BpmnParse bpmnParse, UserTask userTask) {
        userTask.setBehavior(bpmnParse.getActivityBehaviorFactory().createUserTaskActivityBehavior(userTask));
    }

}

ServiceTaskParseHandler 服务任务解析处理器

package org.flowable.engine.impl.bpmn.parser.handler;

import org.apache.commons.lang3.StringUtils;
import org.flowable.bpmn.model.BaseElement;
import org.flowable.bpmn.model.ImplementationType;
import org.flowable.bpmn.model.ServiceTask;
import org.flowable.engine.impl.bpmn.behavior.WebServiceActivityBehavior;
import org.flowable.engine.impl.bpmn.parser.BpmnParse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 服务任务解析处理器
 *
 * @author Joram Barrez
 */
public class ServiceTaskParseHandler extends AbstractActivityBpmnParseHandler<ServiceTask> {

    private static final Logger LOGGER = LoggerFactory.getLogger(ServiceTaskParseHandler.class);

    @Override
    public Class<? extends BaseElement> getHandledType() {
        return ServiceTask.class;
    }

    @Override
    protected void executeParse(BpmnParse bpmnParse, ServiceTask serviceTask) {

        // Email, Mule, Http and Shell service tasks
        if (StringUtils.isNotEmpty(serviceTask.getType())) {

            if ("mail".equalsIgnoreCase(serviceTask.getType())) {
                serviceTask.setBehavior(bpmnParse.getActivityBehaviorFactory().createMailActivityBehavior(serviceTask));

            } else if ("mule".equalsIgnoreCase(serviceTask.getType())) {
                serviceTask.setBehavior(bpmnParse.getActivityBehaviorFactory().createMuleActivityBehavior(serviceTask));

            } else if ("camel".equalsIgnoreCase(serviceTask.getType())) {
                serviceTask.setBehavior(bpmnParse.getActivityBehaviorFactory().createCamelActivityBehavior(serviceTask));

            } else if ("shell".equalsIgnoreCase(serviceTask.getType())) {
                serviceTask.setBehavior(bpmnParse.getActivityBehaviorFactory().createShellActivityBehavior(serviceTask));

            } else if ("dmn".equalsIgnoreCase(serviceTask.getType())) {
                serviceTask.setBehavior(bpmnParse.getActivityBehaviorFactory().createDmnActivityBehavior(serviceTask));

            } else if ("http".equalsIgnoreCase(serviceTask.getType())) {
                serviceTask.setBehavior(bpmnParse.getActivityBehaviorFactory().createHttpActivityBehavior(serviceTask));

            } else if (ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION.equalsIgnoreCase(serviceTask.getImplementationType())) {
                serviceTask.setBehavior(bpmnParse.getActivityBehaviorFactory().createServiceTaskDelegateExpressionActivityBehavior(serviceTask));
                
            } else if (ImplementationType.IMPLEMENTATION_TYPE_EXPRESSION.equalsIgnoreCase(serviceTask.getImplementationType())) {
                serviceTask.setBehavior(bpmnParse.getActivityBehaviorFactory().createServiceTaskExpressionActivityBehavior(serviceTask));
                
            } else {
                LOGGER.warn("Invalid type: '{}' for service task {}", serviceTask.getType(), serviceTask.getId());
            }

            // flowable:class
        } else if (ImplementationType.IMPLEMENTATION_TYPE_CLASS.equalsIgnoreCase(serviceTask.getImplementationType())) {

            serviceTask.setBehavior(bpmnParse.getActivityBehaviorFactory().createClassDelegateServiceTask(serviceTask));

            // flowable:delegateExpression
        } else if (ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION.equalsIgnoreCase(serviceTask.getImplementationType())) {

            serviceTask.setBehavior(bpmnParse.getActivityBehaviorFactory().createServiceTaskDelegateExpressionActivityBehavior(serviceTask));

            // flowable:expression
        } else if (ImplementationType.IMPLEMENTATION_TYPE_EXPRESSION.equalsIgnoreCase(serviceTask.getImplementationType())) {

            serviceTask.setBehavior(bpmnParse.getActivityBehaviorFactory().createServiceTaskExpressionActivityBehavior(serviceTask));

            // Webservice
        } else if (ImplementationType.IMPLEMENTATION_TYPE_WEBSERVICE.equalsIgnoreCase(serviceTask.getImplementationType()) && StringUtils.isNotEmpty(serviceTask.getOperationRef())) {

            WebServiceActivityBehavior webServiceActivityBehavior = bpmnParse.getActivityBehaviorFactory().createWebServiceActivityBehavior(serviceTask, bpmnParse.getBpmnModel());
            serviceTask.setBehavior(webServiceActivityBehavior);

        } else {
            // 服务任务必须有“class”、“delegateExpression”、“type”、“operation”或“expression”属性之一{
            LOGGER.warn("One of the attributes 'class', 'delegateExpression', 'type', 'operation', or 'expression' is mandatory on service task {}", serviceTask.getId());
        }

    }
}

SendTaskParseHandler 发送任务解析处理器

package org.flowable.engine.impl.bpmn.parser.handler;

import org.apache.commons.lang3.StringUtils;
import org.flowable.bpmn.model.BaseElement;
import org.flowable.bpmn.model.ImplementationType;
import org.flowable.bpmn.model.SendTask;
import org.flowable.engine.impl.bpmn.behavior.WebServiceActivityBehavior;
import org.flowable.engine.impl.bpmn.parser.BpmnParse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 发送任务解析处理器
 *
 * @author Joram Barrez
 */
public class SendTaskParseHandler extends AbstractActivityBpmnParseHandler<SendTask> {

    private static final Logger LOGGER = LoggerFactory.getLogger(SendTaskParseHandler.class);

    @Override
    public Class<? extends BaseElement> getHandledType() {
        return SendTask.class;
    }

    @Override
    protected void executeParse(BpmnParse bpmnParse, SendTask sendTask) {

        if (StringUtils.isNotEmpty(sendTask.getType())) {

            if ("mail".equalsIgnoreCase(sendTask.getType())) {
                sendTask.setBehavior(bpmnParse.getActivityBehaviorFactory().createMailActivityBehavior(sendTask));
            } else if ("mule".equalsIgnoreCase(sendTask.getType())) {
                sendTask.setBehavior(bpmnParse.getActivityBehaviorFactory().createMuleActivityBehavior(sendTask));
            } else if ("camel".equalsIgnoreCase(sendTask.getType())) {
                sendTask.setBehavior(bpmnParse.getActivityBehaviorFactory().createCamelActivityBehavior(sendTask));
            } else if ("dmn".equalsIgnoreCase(sendTask.getType())) {
                sendTask.setBehavior(bpmnParse.getActivityBehaviorFactory().createDmnActivityBehavior(sendTask));
            }

        } else if (ImplementationType.IMPLEMENTATION_TYPE_WEBSERVICE.equalsIgnoreCase(sendTask.getImplementationType()) && StringUtils.isNotEmpty(sendTask.getOperationRef())) {

            WebServiceActivityBehavior webServiceActivityBehavior = bpmnParse.getActivityBehaviorFactory().createWebServiceActivityBehavior(sendTask, bpmnParse.getBpmnModel());
            sendTask.setBehavior(webServiceActivityBehavior);

        } else {
            // sendTask{}上的一个属性“type”或“operation”是必需的
            LOGGER.warn("One of the attributes 'type' or 'operation' is mandatory on sendTask {}", sendTask.getId());
        }
    }

}
### Flowable 工作流引擎源码详细解析 #### 一、环境搭建 针对希望深入了解 Flowable 源码的开发者而言,构建一个有效的开发环境至关重要。具体来说,在基于 IntelliJ IDEA 进行 Flowable 源码分析环境搭建的过程中,首要步骤涉及源码获取并将其顺利导入至 IDE 中[^1]。 #### 二、BPMN 解析机制 当涉及到 BPMN 文件(即 `bpmn20.xml`)向 BpmnModel 实体对象转变这一环节时,该过程被细致拆解成了一级标签、二级标签及其下辖子标签三个层面来进行专门化处理。这种分层方式不仅简化了理解难度,还使得追踪特定标签的功能实现变得更加便捷[^2]。 #### 三、流程部署剖析 完成上述准备工作之后,则需关注如何把准备好的业务逻辑封装进可由 Flowable 引擎识别的形式——即将设计阶段产出的模型正式引入运行环境中去。此部分着重描述了从原始 XML 描述直至成为实际可用的工作单元之间的转化路径,包括但不限于资源加载、验证及注册等一系列必要动作[^3]。 #### 四、流程实例创建探究 最后,在一切就绪的前提下,真正的挑战在于怎样依据既定模板高效地触发新的事务序列。这里会详细介绍调用链路的设计思路和技术细节,解释清楚每一个关键节点的作用原理,从而帮助读者掌握利用 API 或者其他手段激活新案例的方法论[^4]。 ```java // 示例代码片段展示如何启动一个新的流程实例 ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("processKey"); System.out.println("Started process instance id " + processInstance.getId()); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值