精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

探索BPMN—工作流技術的理論與實踐

開發 項目管理
異常處理的支持度不夠友好(SmartEngine是異常丟棄),如果在某一個節點上執行失?。ㄒ话闱闆r是業務接口執行失敗導致),默認當前流程進度是卡在該節點的,需要設計張異常表,把當前流程實例,節點實例以及變量都保存下載,通過job重新拉起重試去驅動流程繼續執行,并需要做好告警監控,以及任務實例和流程實例的核對。

一、前言

  • 19世紀70年代,流程管理思想萌芽階段。怎樣提高工作效率?泰勒:標準化個人操作流程亨利·福特:規定標準時間定額標準化、精簡化、通用化、專業化。
  • 20世紀70年代,工作流技術起源于辦公自動化領域的研究。由于當時計算機尚未普及,網絡技術水平還很低以及理論基礎匱乏,這項新技術并未取得成功,許多公司采用紙張表單,手工傳遞的方式,一級一級審批簽字,工作效率非常低下。
  • 20世紀90年代,信息技術驅動流程自動化階段。信息技術開始引入管理領域,對傳統的業務進行自動化改造。產品:Sabre訂票系統,MRP(物料需求計劃),MIS(管理信息系統),CIMS(計算機集成制造系統)。
  • 21世紀初,BPM管理與治理結合。BPR/BPI:以信息技術為核心重新設計業務流程,失敗率高達50%-70%;BPM:以業務流程為主導的管理思想;BPM治理思想:對BPM實施的成功率以及ROI的高要求,強調BPM與企業戰略相結合。

二、BPMN介紹

BPMN(Business Process Modeling Notation,業務流程建模符號)是一種用于描述業務流程的標準化建模語言。它通過圖形符號及規則,幫助企業建模、分析和優化各種業務流程。BPMN有兩個主要版本:BPMN 1.0和BPMN 2.0。BPMN 1.0規范由標準組織BPMI(后并入到OMG)于2004年5月發布;BPMN 2.0標準由OMG于2011年推出。

2.0相對于1.0規范了流程引擎的語義和格式,利用標準的圖元描述真實的業務發生過程,保證相同的流程在不同的流程引擎中得到一致的執行結果。

BPMN的理論基礎

  • 流程建模:BPMN使用不同的圖形符號來表示業務流程中的各項活動、任務、決策和事件等。這些符號包括任務、網關、事件等,每個符號都有特定的含義和用法。
  • 流程分析:通過BPMN模型,企業可以分析業務流程的效率、資源利用率和風險等,以便進行優化和改進。
  • 流程執行:BPMN不僅是一種建模語言,還可以將建模的業務流程實際執行起來,并進行監控和控制。

BPMN的優勢

圖片圖片

傳統使用場景

  • 采購流程:通過BPMN建模,企業可以規范采購流程,包括需求確認、供應商選擇、合同簽訂、物品收貨等環節,提高采購效率。
  • 請假審批流程:BPMN模型可以幫助企業規范請假審批流程,包括員工請假申請、直屬主管審批、人力資源部門審批等環節,減少誤差和糾紛。
  • 客戶投訴處理流程:利用BPMN,企業可以清晰地展示客戶投訴處理流程,包括客戶投訴登記、處理人員分配、處理過程跟蹤、客戶反饋等環節,提高客戶滿意度。

三、實踐舉例:XX平臺XXX商家合規治理任務優化項目(非真實場景)

背景目標

  • 商家合規治理手段的單一性和對線下人工的過度依賴方面需要優化,通過整合商家合規治理策略,并實現這些策略的可在線化配置。這一舉措將打破傳統的手工操作模式,允許業務方直接在系統中配置和更新治理策略,減少人工干預,提高治理效率。同時,在線化配置也便于策略的快速部署和靈活調整,以應對不同業務場景下的合規要求。
  • 各商家的合規治理進度和狀態的透明度方面需要優化,為改變這一現狀,我們需要搭建一套高效的工作流引擎。該引擎將支持商家合規治理流程的編排和自動化流轉,從任務觸發到完成審核、記錄反饋等各個環節都將實現自動化處理。同時,內置的進度跟蹤機制將確保業務團隊能夠實時查看各商家的治理進度,及時發現問題并采取相應措施。這將大大提高治理的透明度和可控性。
  • 評估治理成果和手段的有效性分析方面需要優化,將合規治理成果的數據可視化,通過強大的數據分析與可視化系統,我們將關鍵指標(如治理效率、違規率、改進情況等)以圖表、報告等形式直觀展現。同時,通過持續的數據分析與改進循環,我們將逐步優化治理策略和方式,最終形成商家合規治理的閉環機制。

方案

業務流程

治理流程1治理流程1

治理流程2治理流程2

系統架構圖

流程編排流程編排

工作流技術選型工作流技術選型

圖片圖片

SmartEngine詳細介紹

  E-R圖

圖片圖片

CREATE TABLE `se_deployment_instance` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'PK'  ,
  `gmt_create` datetime(6) NOT NULL   COMMENT 'create time' ,
  `gmt_modified` datetime(6) NOT NULL  COMMENT 'modification time'  ,
  `process_definition_id` varchar(255) NOT NULL  COMMENT 'process definition id'  ,
  `process_definition_version` varchar(255) DEFAULT NULL  COMMENT 'process definition version'  ,
  `process_definition_type` varchar(255) DEFAULT NULL  COMMENT 'process definition type'  ,
  `process_definition_code` varchar(255) DEFAULT NULL  COMMENT 'process definition code'  ,
  `process_definition_name` varchar(255) DEFAULT NULL  COMMENT 'process definition name'  ,
  `process_definition_desc` varchar(255) DEFAULT NULL  COMMENT 'process definition desc'  ,
  `process_definition_content` mediumtext NOT NULL  COMMENT 'process definition content'  ,
  `deployment_user_id` varchar(128) NOT NULL  COMMENT 'deployment user id' ,
  `deployment_status` varchar(64) NOT NULL   COMMENT 'deployment status' ,
  `logic_status` varchar(64) NOT NULL  COMMENT 'logic status' ,


  PRIMARY KEY (`id`)
) COMMENT='流程定義表' ;


CREATE TABLE `se_process_instance` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT  COMMENT 'PK'  ,
  `gmt_create` datetime(6) NOT NULL  COMMENT 'create time' ,
  `gmt_modified` datetime(6) NOT NULL  COMMENT 'modification time' ,
  `process_definition_id_and_version` varchar(128) NOT NULL  COMMENT 'process definition id and version'  ,
  `process_definition_type` varchar(255) DEFAULT NULL COMMENT 'process definition type'  ,
  `status` varchar(64) NOT NULL COMMENT ' 1.running 2.completed 3.aborted',
  `parent_process_instance_id` bigint(20) unsigned DEFAULT NULL   COMMENT 'parent process instance id' ,
  `parent_execution_instance_id` bigint(20) unsigned DEFAULT NULL   COMMENT 'parent execution instance id' ,
  `start_user_id` varchar(128) DEFAULT NULL  COMMENT 'start user id' ,
  `biz_unique_id` varchar(255) DEFAULT NULL  COMMENT 'biz unique id' ,
  `reason` varchar(255) DEFAULT NULL   COMMENT 'reason' ,
  `comment` varchar(255) DEFAULT NULL   COMMENT 'comment' ,
  `title` varchar(255) DEFAULT NULL  COMMENT 'title' ,
  `tag` varchar(255) DEFAULT NULL  COMMENT 'tag' ,


  PRIMARY KEY (`id`)
) COMMENT='流程實例表' ;


CREATE TABLE `se_activity_instance` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT  COMMENT 'PK'  ,
  `gmt_create` datetime(6) NOT NULL   COMMENT 'create time' ,
  `gmt_modified` datetime(6) NOT NULL  COMMENT 'modification time'  ,
  `process_instance_id` bigint(20) unsigned DEFAULT NULL  COMMENT 'process instance id'  ,
  `process_definition_id_and_version` varchar(255) NOT NULL  COMMENT 'process definition id and version'  ,
  `process_definition_activity_id` varchar(64) NOT NULL COMMENT 'process definition activity id'   ,
  PRIMARY KEY (`id`)
) COMMENT='活動節點實例表' ;


CREATE TABLE `se_task_instance` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT  COMMENT 'PK'  ,
  `gmt_create` datetime(6) NOT NULL   COMMENT 'create time' ,
  `gmt_modified` datetime(6) NOT NULL  COMMENT 'modification time'  ,
  `process_instance_id` bigint(20) unsigned NOT NULL  COMMENT 'process instance id'  ,
  `process_definition_id_and_version` varchar(128) DEFAULT NULL  COMMENT 'process definition id and version'  ,
  `process_definition_type` varchar(255) DEFAULT NULL  COMMENT 'process definition type'  ,
  `activity_instance_id` bigint(20) unsigned NOT NULL   COMMENT 'activity instance id' ,
  `process_definition_activity_id` varchar(255) NOT NULL  COMMENT 'process definition activity id' ,
  `execution_instance_id` bigint(20) unsigned NOT NULL  COMMENT 'execution instance id'  ,
  `claim_user_id` varchar(255) DEFAULT NULL   COMMENT 'claim user id' ,
  `title` varchar(255) DEFAULT NULL COMMENT 'title'   ,
  `priority` int(11) DEFAULT 500 COMMENT 'priority' ,
  `tag` varchar(255) DEFAULT NULL  COMMENT 'tag'  ,
  `claim_time` datetime(6) DEFAULT NULL COMMENT 'claim time'   ,
  `complete_time` datetime(6) DEFAULT NULL COMMENT 'complete time'   ,
  `status` varchar(255) NOT NULL COMMENT 'status'     ,
  `comment` varchar(255) DEFAULT NULL  COMMENT 'comment'  ,
  `extension` varchar(255) DEFAULT NULL COMMENT 'extension'  ,


  PRIMARY KEY (`id`)
) COMMENT='人工任務節點實例表'  ;


CREATE TABLE `se_task_assignee_instance` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT  COMMENT 'PK'  ,
  `gmt_create` datetime(6) NOT NULL  COMMENT 'create time'  ,
  `gmt_modified` datetime(6) NOT NULL   COMMENT 'modification time' ,
  `process_instance_id` bigint(20) unsigned NOT NULL  COMMENT 'process instance id'  ,
  `task_instance_id` bigint(20) unsigned NOT NULL  COMMENT 'task instance id'  ,
  `assignee_id` varchar(255) NOT NULL  COMMENT 'assignee id'  ,
  `assignee_type` varchar(128) NOT NULL  COMMENT 'assignee type'  ,
  PRIMARY KEY (`id`)
) COMMENT='人工任務節點代理人實例表'  ;


CREATE TABLE `se_execution_instance` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'PK'   ,
  `gmt_create` datetime(6) NOT NULL   COMMENT 'create time' ,
  `gmt_modified` datetime(6) NOT NULL  COMMENT 'modification time'  ,
  `process_instance_id` bigint(20) unsigned NOT NULL  COMMENT 'process instance id'  ,
  `process_definition_id_and_version` varchar(255) NOT NULL  COMMENT 'process definition id and version'  ,
  `process_definition_activity_id` varchar(255) NOT NULL COMMENT 'process definition activity id'   ,
  `activity_instance_id` bigint(20) unsigned NOT NULL COMMENT 'activity instance id'   ,
  `active` tinyint(4) NOT NULL COMMENT '1:active 0:inactive',
  PRIMARY KEY (`id`)
) COMMENT='執行節點實例表-最細粒度的實例'   ;




CREATE TABLE `se_variable_instance` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT  COMMENT 'PK'  ,
  `gmt_create` datetime(6) NOT NULL  COMMENT 'create time'  ,
  `gmt_modified` datetime(6) NOT NULL  COMMENT 'modification time'  ,
  `process_instance_id` bigint(20) unsigned NOT NULL   COMMENT 'process instance id' ,
  `execution_instance_id` bigint(20) unsigned DEFAULT NULL   COMMENT 'execution instance id' ,
  `field_key` varchar(128) NOT NULL   COMMENT 'field key' ,
  `field_type` varchar(128) NOT NULL   COMMENT 'field type' ,
  `field_double_value` decimal(65,30) DEFAULT NULL   COMMENT 'field double value' ,
  `field_long_value` bigint(20) DEFAULT NULL  COMMENT 'field long value'  ,
  `field_string_value` varchar(4000) DEFAULT NULL  COMMENT 'field string value' ,


  PRIMARY KEY (`id`)
) COMMENT='執行節點變量量表' ;

代碼實操

第一步,要選擇正確的SmartEngine版本,將其添加到pom依賴中。

<dependency>

  <groupld>com.alibaba.smart.framework</groupld>

  <artifactld>smart-engine-extension-storage-custom</artifactld>

  <version>3.0.0</version>

</dependency>

第二步,完成SmartEngine初始化。在初始化時,一般要加載流程定義到應用中。集群情況下,要注意流程定義的一致性(如果純靜態記載則無此類問題)。在初始化時,可以根據需要定義Bean的加載優先級。

import com.alibaba.smart.framework.engine.SmartEngine;
import com.alibaba.smart.framework.engine.configuration.InstanceAccessor;
import com.alibaba.smart.framework.engine.configuration.ProcessEngineConfiguration;
import com.alibaba.smart.framework.engine.configuration.impl.DefaultProcessEngineConfiguration;
import com.alibaba.smart.framework.engine.configuration.impl.DefaultSmartEngine;
import com.alibaba.smart.framework.engine.exception.EngineException;
import com.alibaba.smart.framework.engine.service.command.RepositoryCommandService;
import com.alibaba.smart.framework.engine.util.IOUtil;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;


import java.io.InputStream;


import static org.springframework.core.Ordered.LOWEST_PRECEDENCE;




@Order(LOWEST_PRECEDENCE)
@Configuration
@ConditionalOnClass(SmartEngine.class)
public class SmartEngineAutoConfiguration implements ApplicationContextAware {


    private ApplicationContext applicationContext;


    @Bean
    @ConditionalOnMissingBean
    public SmartEngine constructSmartEngine() {
        ProcessEngineConfiguration processEngineConfiguration = new DefaultProcessEngineConfiguration();
        // 實現InstanceAccessor接口
        processEngineConfiguration.setInstanceAccessor(new CustomInstanceAccessService());


        SmartEngine smartEngine = new DefaultSmartEngine();
        smartEngine.init(processEngineConfiguration);


        // 加載流程定義
        deployProcessDefinition(smartEngine);


        return smartEngine;
    }


    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }


    private class CustomInstanceAccessService implements InstanceAccessor {
        @Override
        public Object access(String name) {
            return applicationContext.getBean(name);
        }
    }


    private void deployProcessDefinition(SmartEngine smartEngine) {
        RepositoryCommandService repositoryCommandService = smartEngine
                .getRepositoryCommandService();


        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        try {
            Resource[] resources = resolver.getResources("classpath*:/smart-engine/*.xml");
            for (Resource resource : resources) {
                InputStream inputStream = resource.getInputStream();
                repositoryCommandService.deploy(inputStream);
                IOUtil.closeQuietly(inputStream);
            }
        } catch (Exception e) {
            throw new EngineException(e);
        }


    }
}

BMPN2.0 xml舉例

附言:排他網關的條件表達式是跟著線條綁定的,要自己確保條件的是和否加在一起的總概率是100%,如果不是100%,小概率執行節點會卡在排他網關走不下去。例如:線條“否”的條件表達式為:條件1為假且條件2為假,線條“是”的條件表達式為條件1為真且條件2為真,則其他條件會卡死在排他網關流程走不下去。

test1.bpmn

<?xml versinotallow="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:modeler="http://camunda.org/schema/modeler/1.0" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Web Modeler" exporterVersion="b1a091a" modeler:executionPlatform="Camunda Cloud" modeler:executionPlatformVersion="8.5.0" camunda:diagramRelationId="2a2c997b-ff2f-49b0-9ba8-3c4860d223e7">
  <bpmn:process id="Process_1qijgvk" name="test1" isExecutable="true">
    <bpmn:startEvent id="StartEvent_1">
      <bpmn:outgoing>Flow_0soou9n</bpmn:outgoing>
    </bpmn:startEvent>
    <bpmn:sequenceFlow id="Flow_0soou9n" sourceRef="StartEvent_1" targetRef="Activity_02gdgyk" />
    <bpmn:endEvent id="Event_1i2y4ym">
      <bpmn:incoming>Flow_07mf0sc</bpmn:incoming>
      <bpmn:incoming>Flow_1nd3369</bpmn:incoming>
      <bpmn:incoming>Flow_160ji3a</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:exclusiveGateway id="Gateway_1kykneu" name="檢查是否5天內完成治理">
      <bpmn:extensionElements />
      <bpmn:incoming>Flow_0exjsc9</bpmn:incoming>
      <bpmn:outgoing>Flow_0hj860q</bpmn:outgoing>
      <bpmn:outgoing>Flow_1oqjt08</bpmn:outgoing>
    </bpmn:exclusiveGateway>
    <bpmn:sequenceFlow id="Flow_0hj860q" name="否" sourceRef="Gateway_1kykneu" targetRef="Activity_1ms8vu6" />
    <bpmn:serviceTask id="Activity_02gdgyk" name="站內通知商戶去治理">
      <bpmn:extensionElements />
      <bpmn:incoming>Flow_0soou9n</bpmn:incoming>
      <bpmn:outgoing>Flow_0exjsc9</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:sequenceFlow id="Flow_0exjsc9" sourceRef="Activity_02gdgyk" targetRef="Gateway_1kykneu" />
    <bpmn:serviceTask id="Activity_1ms8vu6" name="發送sms通知商戶">
      <bpmn:incoming>Flow_0hj860q</bpmn:incoming>
      <bpmn:outgoing>Flow_0bemgki</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:sequenceFlow id="Flow_0bemgki" sourceRef="Activity_1ms8vu6" targetRef="Gateway_1dyp6hh" />
    <bpmn:sequenceFlow id="Flow_1oqjt08" name="是" sourceRef="Gateway_1kykneu" targetRef="Activity_1c9i1el" />
    <bpmn:exclusiveGateway id="Gateway_1dyp6hh" name="是否10天內完成治理">
      <bpmn:incoming>Flow_0bemgki</bpmn:incoming>
      <bpmn:outgoing>Flow_07xq405</bpmn:outgoing>
      <bpmn:outgoing>Flow_1w4qeti</bpmn:outgoing>
    </bpmn:exclusiveGateway>
    <bpmn:sequenceFlow id="Flow_07xq405" name="是" sourceRef="Gateway_1dyp6hh" targetRef="Activity_0m5dsna" />
    <bpmn:serviceTask id="Activity_1c9i1el" name="發放獎勵給到商戶">
      <bpmn:incoming>Flow_1oqjt08</bpmn:incoming>
      <bpmn:outgoing>Flow_1t7ectj</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:sequenceFlow id="Flow_1t7ectj" sourceRef="Activity_1c9i1el" targetRef="Activity_1p6mkdy" />
    <bpmn:task id="Activity_0m5dsna" name="任務完成">
      <bpmn:incoming>Flow_07xq405</bpmn:incoming>
      <bpmn:outgoing>Flow_07mf0sc</bpmn:outgoing>
    </bpmn:task>
    <bpmn:sequenceFlow id="Flow_07mf0sc" sourceRef="Activity_0m5dsna" targetRef="Event_1i2y4ym" />
    <bpmn:sequenceFlow id="Flow_1w4qeti" name="否" sourceRef="Gateway_1dyp6hh" targetRef="Activity_1gud1rw" />
    <bpmn:task id="Activity_1p6mkdy" name="任務完成">
      <bpmn:incoming>Flow_1t7ectj</bpmn:incoming>
      <bpmn:outgoing>Flow_1nd3369</bpmn:outgoing>
    </bpmn:task>
    <bpmn:sequenceFlow id="Flow_1nd3369" sourceRef="Activity_1p6mkdy" targetRef="Event_1i2y4ym" />
    <bpmn:serviceTask id="Activity_1gud1rw" name="通知運營下線商戶店鋪">
      <bpmn:incoming>Flow_1w4qeti</bpmn:incoming>
      <bpmn:outgoing>Flow_0vr5zs3</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:sequenceFlow id="Flow_0vr5zs3" sourceRef="Activity_1gud1rw" targetRef="Activity_1pfbnmo" />
    <bpmn:task id="Activity_1pfbnmo" name="任務結束">
      <bpmn:incoming>Flow_0vr5zs3</bpmn:incoming>
      <bpmn:outgoing>Flow_160ji3a</bpmn:outgoing>
    </bpmn:task>
    <bpmn:sequenceFlow id="Flow_160ji3a" sourceRef="Activity_1pfbnmo" targetRef="Event_1i2y4ym" />
  </bpmn:process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_1">
    <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_1qijgvk">
      <bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
        <dc:Bounds x="152" y="232" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Gateway_1kykneu_di" bpmnElement="Gateway_1kykneu" isMarkerVisible="true">
        <dc:Bounds x="465" y="225" width="50" height="50" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="448" y="188" width="84" height="27" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Activity_02gdgyk_di" bpmnElement="Activity_02gdgyk">
        <dc:Bounds x="270" y="210" width="100" height="80" />
        <bpmndi:BPMNLabel />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Activity_1ms8vu6_di" bpmnElement="Activity_1ms8vu6">
        <dc:Bounds x="630" y="210" width="100" height="80" />
        <bpmndi:BPMNLabel />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Event_1i2y4ym_di" bpmnElement="Event_1i2y4ym">
        <dc:Bounds x="1182" y="232" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Gateway_1dyp6hh_di" bpmnElement="Gateway_1dyp6hh" isMarkerVisible="true">
        <dc:Bounds x="825" y="225" width="50" height="50" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="810" y="285" width="79" height="27" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Activity_1c9i1el_di" bpmnElement="Activity_1c9i1el">
        <dc:Bounds x="630" y="320" width="100" height="80" />
        <bpmndi:BPMNLabel />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Activity_0m5dsna_di" bpmnElement="Activity_0m5dsna">
        <dc:Bounds x="950" y="210" width="100" height="80" />
        <bpmndi:BPMNLabel />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="BPMNShape_0ab1d2g" bpmnElement="Activity_1p6mkdy">
        <dc:Bounds x="840" y="320" width="100" height="80" />
        <bpmndi:BPMNLabel />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Activity_1gud1rw_di" bpmnElement="Activity_1gud1rw">
        <dc:Bounds x="800" y="80" width="100" height="80" />
        <bpmndi:BPMNLabel />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="BPMNShape_02s3tua" bpmnElement="Activity_1pfbnmo">
        <dc:Bounds x="950" y="80" width="100" height="80" />
        <bpmndi:BPMNLabel />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="Flow_0soou9n_di" bpmnElement="Flow_0soou9n">
        <di:waypoint x="188" y="250" />
        <di:waypoint x="270" y="250" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_0exjsc9_di" bpmnElement="Flow_0exjsc9">
        <di:waypoint x="370" y="250" />
        <di:waypoint x="465" y="250" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_0hj860q_di" bpmnElement="Flow_0hj860q">
        <di:waypoint x="515" y="250" />
        <di:waypoint x="630" y="250" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="567" y="232" width="11" height="14" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_1oqjt08_di" bpmnElement="Flow_1oqjt08">
        <di:waypoint x="490" y="275" />
        <di:waypoint x="490" y="360" />
        <di:waypoint x="630" y="360" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="544" y="373" width="11" height="14" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_0bemgki_di" bpmnElement="Flow_0bemgki">
        <di:waypoint x="730" y="250" />
        <di:waypoint x="825" y="250" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_1t7ectj_di" bpmnElement="Flow_1t7ectj">
        <di:waypoint x="730" y="360" />
        <di:waypoint x="840" y="360" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_07mf0sc_di" bpmnElement="Flow_07mf0sc">
        <di:waypoint x="1050" y="250" />
        <di:waypoint x="1182" y="250" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_07xq405_di" bpmnElement="Flow_07xq405">
        <di:waypoint x="875" y="250" />
        <di:waypoint x="950" y="250" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="899" y="232" width="11" height="14" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_1w4qeti_di" bpmnElement="Flow_1w4qeti">
        <di:waypoint x="850" y="225" />
        <di:waypoint x="850" y="160" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="853" y="186" width="11" height="14" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_1nd3369_di" bpmnElement="Flow_1nd3369">
        <di:waypoint x="940" y="360" />
        <di:waypoint x="1120" y="360" />
        <di:waypoint x="1120" y="250" />
        <di:waypoint x="1182" y="250" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_0vr5zs3_di" bpmnElement="Flow_0vr5zs3">
        <di:waypoint x="900" y="120" />
        <di:waypoint x="950" y="120" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_160ji3a_di" bpmnElement="Flow_160ji3a">
        <di:waypoint x="1050" y="120" />
        <di:waypoint x="1120" y="120" />
        <di:waypoint x="1120" y="250" />
        <di:waypoint x="1182" y="250" />
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</bpmn:definitions>
  • process,表示一個流程。
  • id="exclusiveTest" versinotallow="1.0.0",分別表示流程定義的id和版本。這兩個字段唯一區分一個流程定義。
  • startEvent,表示流程開始節點。只允許有一個開始節點。
  • endEvent,表示流程結束節點??梢杂卸鄠€結束節點。
  • sequenceFlow,表示環節流轉關系。sourceRef="theStart" targetRef="submitTask" 分別表示起始節點和目標節點。該節點有個子節點, approve == 'agree',這個片段很重要,用來描述流程流轉的條件。approve == 'upgrade'使用的是MVEL表達式語法。另外,還值得注意的是,在驅動流程運轉時,需要傳入正確的參數。比如說,在后面介紹的api中,通常會需要在Map中傳遞業務請求參數。那么需要將Map中的key和Mvel的運算因子關聯起來。以這個例子來說,request.put("approve", "agree");里面的approve和approve == 'agree'命名要一致。
  • exclusiveGateway,表示互斥網關。該節點非常重要。用來區分流程節點的不同轉向?;コ饩W關在引擎執行conditionExpression后,有且只能選擇一條匹配的sequenceFlow繼續執行。
  • serviceTask,服務任務,用來表示執行一個服務,所以他會有引擎默認的擴展:smart:class="com.alibaba.smart.framework.example.AuditProcessServiceTaskDelegation". Client Developer使用時,需要自定義對應的業務實現類。在該節點執行時,它會自動執行服務調用,執行smart:class 這個 delegation。該節點不暫停,會自動往下一個流轉。
  • receiveTask,接收任務。在引擎遇到此類型的節點時,引擎執行會自動暫停,等待外部調用signal方法。當調用signal方法時,會驅動流程當前節點離開。在離開該節點時,引擎會自動執行smart:class 這個delegation。在一般業務場景中,我們通常使用receiveTask來表示等需要等待外部回調的節點。
  • userTask,表示用戶任務節點,僅用于DataBase模式。該節點需要人工參與處理,并且通常需要在待辦列表中展示。在Custom模式下,建議使用receiveTask來代替。
  • parallelGateway,這個節點并未在上述流程定義中體現,這里詳細說一下。parallelGateway 首先必須成對出現,分別承擔fork和join職責。其次,在join時需要實現分布式鎖接口:LockStrategy。第三,fork默認是順序遍歷多個sequeceFlow,但是你如果需要使用并發fork功能的話,則需要實現該接口:ExecutorService。

重要領域對象

  • 部署實例: DeploymentInstance,描述這個流程定義是誰發布的,當前處于什么狀態。
  • 流程定義: ProcessDefinition,描述一個流程有幾個環節,之間的流轉關系是什么樣子的。
  • 流程實例: ProcessInstance,可以簡單理解為我們常見的一個工單。
  • 活動實例: ActivityInstance,主要是描述流程實例(工單)的流轉軌跡。
  • 執行實例: ExecutionInstance,主要根據該實例的狀態,來判斷當前流程處在哪個節點上。
  • 任務實例: TaskInstance,用來表示人工任務處理的,可以理解為一個需要人工參與處理的環節。
  • 任務處理:TaskAssigneeInstance,用來表示當前任務共有幾個處理者。通常在代辦列表中用到此實體。
  • 變量實例:VariableInstance,用來存儲流程實例上下文。

SmartEngine引擎源碼地址:https://github.com/alibaba/SmartEngine/tree/master

SmartEngine UserGuide:  https://github.com/alibaba/SmartEngine/wiki/SmartEngine-UserGuide--Chinese-Version-%28%E4%B8%AD%E6%96%87%E7%89%88%29

Camunda開源流程設計器(支持在線和本地node.js部署兩種方式):https://camunda.com/download/modeler/

Camunda設計器學習文檔:https://docs.camunda.io/docs/components/modeler/bpmn/bpmn-primer/

四、總結與建議

優點

  • 業務流程可視化與實際系統流程可視化高度一致,所見即所得。
  • 調整效率高(業務平均每個月會升級一次治理流程),如果業務流程1.0要升級到1.1,只需要重新復制一份bpmn.xml流程模板重新編排為1.1,并下發流程實例即可,不影響原有的流程模板和流程實例執行(調整效率由原來的一周縮短到1小時)。
  • 流程實例和流程節點實例可視,方便監控各個節點的執行和數據報表的產出。

缺點

  • 異常處理的支持度不夠友好(SmartEngine是異常丟棄),如果在某一個節點上執行失?。ㄒ话闱闆r是業務接口執行失敗導致),默認當前流程進度是卡在該節點的,需要設計張異常表,把當前流程實例,節點實例以及變量都保存下載,通過job重新拉起重試去驅動流程繼續執行,并需要做好告警監控,以及任務實例和流程實例的核對。
  • 高并發場景的支持度并不是太友好,要通過異步消息的方式來控制創建流程實例的速度,目前得到的創建流程實例的TPS是100/s單臺,只是相對于activiti來說并發支持度要高,超過這個上限的場景建議謹慎使用。
  • 可擴展性不足,例如:ProcessQueryService只支持findById,findList,count;ExecutionQueryService只支持findActiveExecutionList,findAll這些基本查詢 ,復雜查詢需要新寫SmartEngine核心包,升級jar包版本后才可使用。
  • 無歷史記錄表,每隔一段時間要清理表中流程實例已經完結的相關數據,否則歷史數據堆積影響查詢效率。

建議

如果業務流程的復雜度一般,且經常會調整,并發量并不高的情況下,建議使用;如果業務復雜度過高,或并發量TPS超過單臺100/s,不建議使用。

責任編輯:武曉燕 來源: 得物技術
相關推薦

2021-07-26 18:38:48

Bpmn流程

2023-08-02 18:48:23

Flowable工作流引擎

2022-02-21 10:50:28

SvnGitHub分支

2009-03-03 09:13:36

工作流BPM業務流程

2024-04-07 00:06:00

Rust編程技巧

2022-10-26 08:00:43

Activiti工作流BPM

2009-07-31 17:34:40

ASP.NET工作流

2021-10-14 11:34:05

技術工作流引擎

2025-09-04 01:33:00

Flowable工作流引擎

2017-04-05 10:06:59

工作流界面抽象組件

2013-04-23 10:28:08

IBeamMDAAWF

2024-04-25 08:00:00

DevOps架構軟件開發

2024-12-05 12:01:09

2022-06-30 09:30:36

FlinkSQL流批一體京東

2020-08-06 08:26:22

Kubernetes架構開發

2015-03-13 15:58:11

Adobe

2015-07-14 09:26:28

微型工作流引擎設計

2020-08-06 08:16:26

Kubernetes架構開源

2022-07-14 10:06:20

工作流引擎營銷自動化vivo

2025-06-16 04:00:00

Spring彈幕技術
點贊
收藏

51CTO技術棧公眾號

国产成人精品日本亚洲11 | 色综合咪咪久久网| 欧美疯狂做受xxxx富婆| 亚洲熟妇国产熟妇肥婆| 懂色av中文在线| 国产尤物一区二区在线| 51色欧美片视频在线观看| 国产精品免费在线视频| 国产精品久久久网站| 欧美三级电影精品| 99热在线这里只有精品| 成人在线网址| 久久久蜜桃精品| 成人9ⅰ免费影视网站| 日本熟妇一区二区三区| 尤物网精品视频| 日韩中文字幕视频在线| 性久久久久久久久久久| 麻豆久久一区| 欧美日韩视频一区二区| 凹凸国产熟女精品视频| 超碰公开在线| 国产精品久久久久影院亚瑟 | 国产精品观看在线亚洲人成网| 久久久.www| 欧美午夜精品一区二区三区电影| 精品国偷自产国产一区| 中文字幕线观看| 中文字幕不卡三区视频| 亚洲成av人片| 日韩亚洲欧美一区二区| 精品黄色免费中文电影在线播放| 国产欧美日韩视频一区二区| 久久久久se| 欧美一级性视频| 国产成人精品一区二区三区四区| 国产精品亚洲一区二区三区| 波多野结衣二区三区| 国产一区导航| 97色在线观看| 亚洲国产精一区二区三区性色| 亚洲久久久久| 久久天天躁狠狠躁夜夜躁| 国产性猛交xx乱| 残酷重口调教一区二区| 亚洲视频视频在线| 欧洲av一区二区三区| 亚洲三级网址| 亚洲一二三在线| 男人天堂av电影| 欧美精品第一区| 国产亚洲视频中文字幕视频| 国产高清一区二区三区四区| 波多野结衣的一区二区三区| 国产一区二区三区日韩欧美| 免费看91的网站| 成人情趣视频网站| 色噜噜狠狠狠综合曰曰曰| 日本一二三不卡视频| 欧美日韩在线二区| 日韩在线小视频| 婷婷伊人五月天| 欧美丰满日韩| 九九久久综合网站| 日韩av在线天堂| 蜜桃av一区| 国产精品夜色7777狼人| 国产成年妇视频| www.av亚洲| 欧美日韩在线精品一区二区三区| 久草视频视频在线播放| 国产精品久久久久影院老司| 日本a在线天堂| 欧产日产国产精品视频| 91国在线观看| 日本中文字幕在线不卡| 国产精品黄网站| 亚洲少妇激情视频| www色aa色aawww| 欧美日韩专区| 欧美有码在线观看| 一区不卡在线观看| 成人sese在线| 视频一区视频二区视频三区视频四区国产 | 99久久精品久久久久久清纯| 欧美视频1区| 成人无遮挡免费网站视频在线观看| 亚洲一区二区欧美日韩| 国产精品69页| 麻豆精品一区| 亚洲视频axxx| 精品无码人妻一区二区三区| 日韩一区精品字幕| 99久re热视频这里只有精品6| 熟妇高潮一区二区高潮| 国产精品成人一区二区艾草 | 日本免费高清一区二区| 香蕉成人app免费看片| 91久久香蕉国产日韩欧美9色| 美女被艹视频网站| 国产麻豆精品久久| 欧美激情亚洲自拍| 一级久久久久久久| 久久久午夜精品理论片中文字幕| 日韩精品无码一区二区三区| 爱福利在线视频| 69久久99精品久久久久婷婷| 日本aaa视频| 欧美日韩亚洲一区三区| 国产精品日日做人人爱| 日韩欧美亚洲系列| 夜夜爽夜夜爽精品视频| 黄色三级视频在线| 要久久电视剧全集免费| 久久久久国产精品免费| 国产又大又粗又长| 国产日韩欧美麻豆| 日韩精品一区二区三区久久| 日韩精品三级| 久久不射电影网| 伊人网中文字幕| 久久精品亚洲乱码伦伦中文| 无码人妻精品一区二区三区在线| 深夜福利一区二区三区| 日韩视频免费中文字幕| 国产精华7777777| 国产婷婷一区二区| 欧美国产亚洲一区| 久久精品福利| 久久男人的天堂| 亚洲乱码精品久久久久..| 国产精品热久久久久夜色精品三区| av网站在线观看不卡| 精品一区二区男人吃奶| 欧美—级a级欧美特级ar全黄| 一区二区国产欧美| 国产精品拍天天在线| 天天天干夜夜夜操| sdde在线播放一区二区| 国产精品久久久久久久久久久新郎| 四虎精品在永久在线观看| 午夜伊人狠狠久久| 亚洲av成人片无码| 一区二区毛片| 蜜桃传媒视频第一区入口在线看| 久热在线观看视频| 亚洲精品久久久久久久久久久久久 | 欧美激情91| 99久久无色码| zzzwww在线看片免费| 日韩精品欧美国产精品忘忧草| 日韩网红少妇无码视频香港| 91女厕偷拍女厕偷拍高清| 成年人视频观看| 久久综合欧美| 国产日韩精品在线观看| www.成人.com| 欧美老人xxxx18| 国产黄在线免费观看| 国产精品88av| jizzjizz国产精品喷水| 国产剧情在线观看一区| 国产免费一区二区三区在线能观看 | 九九亚洲精品| 国产精品一香蕉国产线看观看 | 伊人色综合久久天天| 91精产国品一二三| 免费永久网站黄欧美| 日韩在线三区| 精品一区二区三区四区五区| 欧美激情精品久久久久久免费印度 | 超碰精品一区二区三区乱码| 老熟妇高潮一区二区高清视频| 欧美色xxxx| 极品尤物一区二区| 国产成人午夜片在线观看高清观看| 国产日韩av网站| 国产精选一区| 99精品国产一区二区| 小h片在线观看| 久久久极品av| 神马亚洲视频| 91精品一区二区三区在线观看| 久一视频在线观看| 国产午夜亚洲精品不卡| 国产又黄又嫩又滑又白| 另类亚洲自拍| 影音先锋成人资源网站| 亚洲资源网站| 国产经品一区二区| 国产成+人+综合+亚洲欧美| 欧美日韩成人在线播放| 国产高清免费在线播放| 亚洲成人性视频| 一本色道久久综合熟妇| 精品久久久免费| 欧美丰满熟妇bbbbbb| 久久久天堂av| 少妇激情一区二区三区视频| 美女免费视频一区二区| 日韩少妇内射免费播放| 欧美精品导航| 亚洲五月六月| 亚洲专区视频| 国产日韩精品推荐| 国产成人免费视频网站视频社区 | 久久在线免费视频| 国产毛片av在线| 亚洲精品电影网站| 东京干手机福利视频| 欧美日韩美少妇| 激情视频网站在线观看| 亚洲3atv精品一区二区三区| 九九热最新地址| 国产精品入口麻豆原神| 国产熟妇久久777777| 成人黄色国产精品网站大全在线免费观看 | 国产内射老熟女aaaa| 日韩欧美视频在线播放| 日本欧美精品久久久| 欧美三级午夜理伦三级小说| 成人欧美一区二区三区黑人免费| 日韩av黄色| 国产色视频一区| 亚洲精品粉嫩美女一区| 欧美中文在线观看国产| 亚洲妇女成熟| 91国内揄拍国内精品对白| 手机av免费在线| 免费91在线视频| 麻豆网站在线看| 日韩有码片在线观看| www.91在线| 中文字幕欧美日韩精品| 高清毛片在线看| 亚洲天堂av综合网| 黄视频在线观看免费| 亚洲欧美中文字幕| 欧美偷拍视频| 亚洲人成亚洲人成在线观看| 毛片在线播放网址| 亚洲人高潮女人毛茸茸| 丁香婷婷在线观看| 色婷婷综合久久久久| 天堂中文а√在线| 久久久国产精品亚洲一区| 成人短视频在线| 欧美国产日韩免费| sm在线观看| 日本成熟性欧美| 国产电影一区二区三区爱妃记| 国产精品91在线| 欧美激情福利| 147欧美人体大胆444| 97久久精品| 国产伦精品一区二区三区四区视频 | 亚洲福利在线视频| 天堂av电影在线观看| 亚洲美女喷白浆| 成人动漫在线免费观看| 日韩小视频在线观看| 日本h片在线| 777国产偷窥盗摄精品视频| 欧美gay视频| 成人国产精品日本在线| 91成人短视频| 欧美日韩国产精品一区二区| 日本久久综合| 免费在线黄网站| 欧美资源在线| 成年人网站av| 91亚洲精品乱码久久久久久蜜桃 | 欧美一区二区少妇| 最近2019中文字幕mv免费看| 曰本三级在线| 欧洲成人午夜免费大片| 中文字幕日本一区| 国产一区二区免费在线观看| 国产精品一区二区99| 日韩视频一二三| 亚洲女同同性videoxma| 污污网站在线观看视频| 成+人+亚洲+综合天堂| 国产jjizz一区二区三区视频| 亚洲三级在线播放| 久久久精品免费看| 欧美男男青年gay1069videost| 性色av蜜臀av| 伊人亚洲福利一区二区三区| 欧美卡一卡二| 国产中文字幕91| 日韩影视高清在线观看| 99热一区二区三区| 久久婷婷麻豆| 中国黄色片视频| 亚洲欧美影音先锋| 91在线视频免费播放| 日韩欧美国产成人一区二区| 国产主播福利在线| 久久噜噜噜精品国产亚洲综合| 欧美视频免费看| 六十路精品视频| 国内自拍一区| 男生操女生视频在线观看| 91蜜桃传媒精品久久久一区二区| 欧美黑人性猛交xxx| 欧美性色aⅴ视频一区日韩精品| 日韩有码第一页| 久久国产精品网站| 国产成人久久精品麻豆二区| 欧美日韩国产免费一区二区三区| 好看不卡的中文字幕| 99日在线视频| 国产精品色婷婷| 性高潮视频在线观看| 亚洲精品资源美女情侣酒店| 高h视频在线播放| 91免费看片在线| 91亚洲国产成人久久精品| 国产精品亚洲a| 久久综合色婷婷| 亚洲精品国产精品乱码| 精品99一区二区| 激情图片在线观看高清国产| 亚洲精品欧美一区二区三区| 欧美大黑bbbbbbbbb在线| 一区二区xxx| 日本一区二区三区四区| 波多野结衣二区三区| 亚洲色在线视频| 精品欧美一区二区三区在线观看 | 91精品国产99久久久久久红楼| 国产国产精品| 亚洲男人天堂av在线| 亚洲欧洲精品天堂一级| 91精品国自产| 久久久av一区| 国色天香久久精品国产一区| 国产日韩第一页| 国产成人a级片| 亚洲一区二区91| 亚洲国产精品999| 欧美日韩国产观看视频| 免费久久久一本精品久久区| 久久国产欧美| 亚洲图片第一页| 欧美高清精品3d| 午夜激情在线| 国内成+人亚洲| 久久久一二三| 综合 欧美 亚洲日本| 91精品国产综合久久久久久| 丝袜国产在线| 久久久福利视频| 青娱乐精品在线视频| 永久免费看片直接| 日韩视频免费观看高清完整版| 欧美性猛片xxxxx免费中国| 精品视频在线观看| 三级在线观看一区二区| 国产成人精品视频免费| 欧美一级理论片| www.超碰在线| 视频在线99| 大桥未久av一区二区三区中文| 日韩免费不卡视频| 亚洲视频日韩精品| 99久久999| 免费看一级大黄情大片| 亚洲国产成人私人影院tom| 国产乱码精品一区二三区蜜臂 | 久久99国产综合精品女同| 精品女人视频| 在线看的黄色网址| 一区二区成人在线| 日韩欧美亚洲系列| 91亚洲精品久久久| 国产一区二区三区久久| 激情高潮到大叫狂喷水| 精品成人一区二区三区四区| 97久久香蕉国产线看观看| 三年中国中文在线观看免费播放| av成人老司机| 97av免费视频| 欧美在线观看视频| 在线中文字幕亚洲| 在线观看国产精品一区| 日韩免费在线观看| 97精品国产综合久久久动漫日韩| 日韩极品视频在线观看| 国产欧美日韩视频在线观看| 人妻夜夜爽天天爽| 国产免费亚洲高清| 亚洲在线日韩| 麻豆成人在线视频| 色妞在线综合亚洲欧美| 欧美黑人做爰爽爽爽| 性生活一级大片| 欧美性视频一区二区三区| 国产在线观看www|