Flowable源码注释(六)部署生成器

本文介绍了Flowable工作流引擎中的DeploymentBuilder接口及其实现类DeploymentBuilderImpl,详细解析了如何通过这些API创建并配置部署,包括添加资源、禁用验证等功能。

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

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

DeploymentBuilder 部署生成器接口类

  • 用于创建新部署的生成器。

  • 生成器实例可以通过{@link org.flowable.engine.RepositoryService#createDeployment()}获得。

  • 在调用{@link#deploy()}操作之前,可以将多个资源添加到一个部署中。

  • 部署后,无法对返回的部署进行更多更改,并且可以释放生成器实例。

package org.flowable.engine.repository;

import java.io.InputStream;
import java.util.Date;
import java.util.zip.ZipInputStream;

import org.flowable.bpmn.model.BpmnModel;

/**
 * @author Tom Baeyens
 * @author Joram Barrez
 */
public interface DeploymentBuilder {

    DeploymentBuilder addInputStream(String resourceName, InputStream inputStream);

    DeploymentBuilder addClasspathResource(String resource);

    DeploymentBuilder addString(String resourceName, String text);

    DeploymentBuilder addBytes(String resourceName, byte[] bytes);

    DeploymentBuilder addZipInputStream(ZipInputStream zipInputStream);

    DeploymentBuilder addBpmnModel(String resourceName, BpmnModel bpmnModel);

    /**
     * 如果调用,则不会对BPMN 2.0 XSD进行XML模式验证.
     * 
     * 一般不推荐.
     */
    DeploymentBuilder disableSchemaValidation();

    /**
     * 如果调用,则不会根据流程定义验证流程定义在引擎上是否可执行.
     * 
     * 一般不推荐.
     */
    DeploymentBuilder disableBpmnValidation();

    /**
     * 为部署提供给定的名称.
     */
    DeploymentBuilder name(String name);

    /**
     * 为部署提供给定的类别.
     */
    DeploymentBuilder category(String category);

    /**
     * 为部署提供给定的密钥.
     */
    DeploymentBuilder key(String key);
    
    /**
     * 为部署提供给定的父部署id.
     */
    DeploymentBuilder parentDeploymentId(String parentDeploymentId);

    /**
     * 为部署提供给定的租户id.
     */
    DeploymentBuilder tenantId(String tenantId);

    /**
     * 如果已设置,则此部署将与以前的任何部署进行比较。这意味着每个(未生成的)资源都将与此部署提供的资源进行比较.
     */
    DeploymentBuilder enableDuplicateFiltering();

    /**
     *设置激活此部署中包含的流程定义的日期。这意味着所有流程定义都将像往常一样部署,但它们将从给定的日期开始激活.
     */
    DeploymentBuilder activateProcessDefinitionsOn(Date date);

    /**
     * 允许将影响部署的属性添加到此{@link DeploymentBuilder}.
     */
    DeploymentBuilder deploymentProperty(String propertyKey, Object propertyValue);

    /**
     * 将所有提供的源部署到流程引擎.
     */
    Deployment deploy();

}

DeploymentBuilderImpl 部署生成器实现类

public class DeploymentBuilderImpl implements DeploymentBuilder, Serializable {

    private static final long serialVersionUID = 1L;
    protected static final String DEFAULT_ENCODING = "UTF-8";

    protected transient RepositoryServiceImpl repositoryService;
    protected transient ResourceEntityManager resourceEntityManager;

    protected DeploymentEntity deployment;
    protected boolean isBpmn20XsdValidationEnabled = true;
    protected boolean isProcessValidationEnabled = true;
    protected boolean isDuplicateFilterEnabled;
    protected Date processDefinitionsActivationDate;
    protected Map<String, Object> deploymentProperties = new HashMap<>();

    public DeploymentBuilderImpl(RepositoryServiceImpl repositoryService) {
        this.repositoryService = repositoryService;
        this.deployment = CommandContextUtil.getProcessEngineConfiguration().getDeploymentEntityManager().create();
        this.resourceEntityManager = CommandContextUtil.getProcessEngineConfiguration().getResourceEntityManager();
    }

    @Override
    public DeploymentBuilder addInputStream(String resourceName, InputStream inputStream) {
        if (inputStream == null) {
            throw new FlowableIllegalArgumentException("inputStream for resource '" + resourceName + "' is null");
        }
        byte[] bytes = IoUtil.readInputStream(inputStream, resourceName);
        ResourceEntity resource = resourceEntityManager.create();
        resource.setName(resourceName);
        resource.setBytes(bytes);
        deployment.addResource(resource);
        return this;
    }

    @Override
    public DeploymentBuilder addClasspathResource(String resource) {
        InputStream inputStream = ReflectUtil.getResourceAsStream(resource);
        if (inputStream == null) {
            throw new FlowableIllegalArgumentException("resource '" + resource + "' not found");
        }
        return addInputStream(resource, inputStream);
    }

    @Override
    public DeploymentBuilder addString(String resourceName, String text) {
        if (text == null) {
            throw new FlowableIllegalArgumentException("text is null");
        }
        ResourceEntity resource = resourceEntityManager.create();
        resource.setName(resourceName);
        try {
            resource.setBytes(text.getBytes(DEFAULT_ENCODING));
        } catch (UnsupportedEncodingException e) {
            throw new FlowableException("Unable to get process bytes.", e);
        }
        deployment.addResource(resource);
        return this;
    }

    @Override
    public DeploymentBuilder addBytes(String resourceName, byte[] bytes) {
        if (bytes == null) {
            throw new FlowableIllegalArgumentException("bytes is null");
        }
        ResourceEntity resource = resourceEntityManager.create();
        resource.setName(resourceName);
        resource.setBytes(bytes);

        deployment.addResource(resource);
        return this;
    }

    @Override
    public DeploymentBuilder addZipInputStream(ZipInputStream zipInputStream) {
        try {
            ZipEntry entry = zipInputStream.getNextEntry();
            while (entry != null) {
                if (!entry.isDirectory()) {
                    String entryName = entry.getName();
                    byte[] bytes = IoUtil.readInputStream(zipInputStream, entryName);
                    ResourceEntity resource = resourceEntityManager.create();
                    resource.setName(entryName);
                    resource.setBytes(bytes);
                    deployment.addResource(resource);
                }
                entry = zipInputStream.getNextEntry();
            }
        } catch (Exception e) {
            throw new FlowableException("problem reading zip input stream", e);
        }
        return this;
    }

    @Override
    public DeploymentBuilder addBpmnModel(String resourceName, BpmnModel bpmnModel) {
        BpmnXMLConverter bpmnXMLConverter = new BpmnXMLConverter();
        String bpmn20Xml = new String(bpmnXMLConverter.convertToXML(bpmnModel), StandardCharsets.UTF_8);
        addString(resourceName, bpmn20Xml);
        return this;
    }

    @Override
    public DeploymentBuilder name(String name) {
        deployment.setName(name);
        return this;
    }

    @Override
    public DeploymentBuilder category(String category) {
        deployment.setCategory(category);
        return this;
    }

    @Override
    public DeploymentBuilder key(String key) {
        deployment.setKey(key);
        return this;
    }
    
    @Override
    public DeploymentBuilder parentDeploymentId(String parentDeploymentId) {
        deployment.setParentDeploymentId(parentDeploymentId);
        return this;
    }

    @Override
    public DeploymentBuilder disableBpmnValidation() {
        this.isProcessValidationEnabled = false;
        return this;
    }

    @Override
    public DeploymentBuilder disableSchemaValidation() {
        this.isBpmn20XsdValidationEnabled = false;
        return this;
    }

    @Override
    public DeploymentBuilder tenantId(String tenantId) {
        deployment.setTenantId(tenantId);
        return this;
    }

    @Override
    public DeploymentBuilder enableDuplicateFiltering() {
        this.isDuplicateFilterEnabled = true;
        return this;
    }

    @Override
    public DeploymentBuilder activateProcessDefinitionsOn(Date date) {
        this.processDefinitionsActivationDate = date;
        return this;
    }

    @Override
    public DeploymentBuilder deploymentProperty(String propertyKey, Object propertyValue) {
        deploymentProperties.put(propertyKey, propertyValue);
        return this;
    }

    @Override
    public Deployment deploy() {
        return repositoryService.deploy(this);
    }

    // getters and setters
    // //////////////////////////////////////////////////////

    public DeploymentEntity getDeployment() {
        return deployment;
    }

    public boolean isProcessValidationEnabled() {
        return isProcessValidationEnabled;
    }

    public boolean isBpmn20XsdValidationEnabled() {
        return isBpmn20XsdValidationEnabled;
    }

    public boolean isDuplicateFilterEnabled() {
        return isDuplicateFilterEnabled;
    }

    public Date getProcessDefinitionsActivationDate() {
        return processDefinitionsActivationDate;
    }

    public Map<String, Object> getDeploymentProperties() {
        return deploymentProperties;
    }

}
Flowable是一个开源的工作流引擎,用于实现公文流转等各种业务流程。具体而言,Flowable提供了一套完整的流程模型、管理和执行的功能。在Flowable中,公文流转可以通过以下几个步骤实现: 1. 定义流程模型:使用Flowable的模型设计器,可以创建和定义公文流转的流程模型。这个模型包括了公文流转的各个环节、参与者和流程规则等信息。 2. 部署流程:将流程模型部署Flowable的引擎中,使其可以被执行。部署可以通过Flowable的API或者图形界面进行操作。 3. 启动流程实例:根据已定义的流程模型,可以通过Flowable的API启动一个新的流程实例。每个流程实例对应一个具体的公文流转实例。 4. 执行流程任务:在流程实例启动后,根据流程模型的定义,系统会生成一系列待办任务。这些任务可以被分配给相应的参与者,参与者可以在Flowable的用户界面或者接口中完成任务。 5. 流程控制和决策:Flowable提供了灵活的流程控制和决策能力,可以根据业务需求自定义流程规则和条件。 6. 监控和管理:Flowable提供了丰富的监控和管理功能,可以实时查看流程实例的状态、任务进展和性能指标等信息。 通过以上步骤,Flowable可以实现公文流转的全过程管理和执行。具体的实现细节可以参考Flowable源码以及相关文档和示例。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* *2* [Flowable源码注释(四十八)流程解析处理器](https://blog.youkuaiyun.com/JinYJ2014/article/details/123055277)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值