Activiti7开发入门

 

 

一、      BPM

BPM,即业务流程管理,是一种以规范化的构造端到端的卓越业务流程为中心,以持续的提高组织业务绩效为目的的系统化方法,常见商业管理教育如EMBA、MBA等均将BPM包含在内。

通常,BPM也指针对流程管理的信息化系统,其特点是注重流程驱动为核心,实现端到端全流程信息化管理。

 

二、      BPMN

BPM有很多种建模语言,BPMN(Business Process Modeling Notation)就是其中的一种建模语言。

BPMN标准是听得比较多的工作流标准,此外还有XPDL,BPML等。甚至他们的出现时间比BPMN更早,只是因为一些技术和非技术原因,BPMN2.0最终被普遍使用。。。

 

三、      工作流与BPMN

3.1什么是工作流引擎

工作流引擎是一个用于管理和调度流程的应用程序,可以集成并作为程序框架使用,包括流程定义的存储,流程的节点与流程条件判断和调度、流向管理、流程实例管理等功能。

3.2工作流引擎与BPMN有什么关系

通过BPMN(业务流程建模语言)来进行BPM(业务流程建模)得到的结果就是业务流程的定义,它规定了业务的流转过程由谁参与等等。而协调并执行这个流程,记录流程的执行过程和结果就是工作流引擎的职责范围了。

3.3工作流引擎的比较

我们选取了Java领域业界相对主流的工作流引擎进行对比分析

JBPMJava Business Process Management

由JBoss公司开发,目前最高版本JPBM7,不过从JBPM5开始已经跟之前不是同一个产品了,JBPM5的代码基础不是JBPM4,而是从Drools Flow重新开始。下面要涉及的很多产品都是以JBPM4的代码为起点进行开发的。

 

Activiti

Alfresco软件开发,基于JBPM4,后并入OMG,目前最高版本activiti 7。Activiti5版本的时候,核心团队发生了比较大的变动(离职),activiti6的开发团队在新版本中去除了PVM,纳入了DMN,重构XML解析,BUG较多,目前主要团队致力于activiti7,5&6已经官宣不维护。

Flowable

基于activiti6,最新的开源版本是flowable6,开发团队是从activiti中分裂出来的,修复了一众activiti6的bug,并在其基础上研发了DMN支持,BPEL支持等等。相对开源版,其商业版的功能会更强大。

Camunda

基于activiti5,所以其保留了PVM,最新版本Camunda7,开发团队也是从activiti中分裂出来的,发展轨迹与flowable相似,同时也提供了商业版。

JFlow

前身ccFlow,国产的工作流引擎,由济南驰骋公司开发维护,主打中国式的业务流程,由于是国产的软件,中文化程度比较深,业务开发也对用户比较友好。国产的开源工作流引擎还是挺多的,JFlow是其中功能比较完善的一个,同时对比activiti,流程上更加中国化,支持自定义流程跳转,加签等。其他国产工作流就不列举了。

Osworkflow

完全用java语言编写的开放源代码的工作流引擎,具有显著的灵活性及完全面向有技术背景的用户的特点。由opensymphony组织维护,其不遵守XPDL等业务规范,完全使用XML编排业务。面向开发人员。

Shark

靠山是Enhydra。是一个可扩展的工作流引擎框架,它包括一个完全基于 WFMC 规范的标准实现,它使用XPDL(没有任何自己新的扩展)作为自身的工作流流程定义格式。其持久层和设计器都是自己公司研发的,持久层实现采用的标准是轻量级的Enhydra DODS O/R mapping 工具,设计器可以用Enhydra JaWE 图形XPDL编辑器。

Apache ODE

轻型的、可嵌入的组件,利用组件组装成一个完整的BPM系统。关键模块包括ODE BPEL编译器、ODE BPEL运行时、ODE数据访问对象(DAOs)、ODE集成层(ILs)和用户工具。虽然挂在Apache下面,但已经年久失修。

还有很多工作流,比如ProcessMaker,SWF,oracle,Bonita,openwebflow,snaker等,不过做BPM的话,相对于上面列举的产品还是有些缺陷,比如流程过于简单,资料过少等。

 

 

四、      BPMN详解

https://www.cnblogs.com/zhaosq/p/10081329.html

 

 

五、            Activiti

官网:https://www.activiti.org/

Github:https://github.com/Activiti/Activiti

六、            K2设计器与Activiti的bpmn设计器

6.1流程图

 

 

 

 

 

 

6.2变量

K2变量是固定的。Activiti变量可以随时添加(启动流程时,审批时…)

 

 

 

 

 

6.3线路走向条件

  

 

 

 

 

6.4源码比较

从下面能看出很大不同,activiti 不包括Java代码。发布的时候业务监听代码是不一起发布的。K2发布是和C#代码打包发布的,所以不存在版本问题。

 

 

 

 

七、            开发环境

7.1 IDE

Eclipse,IntelliJ IDEA等

7.2 JDK

我这里用的是11

 

 

7.3 数据库

Activiti支持数据库h2, mysql, oracle, postgres, mssql, db2等。

 

7.4 BPMN2.0插件

按照如下安装
7.4.1 打开 Help -> Install New Software. 在如下面板中: 

 

 

 


7.4.2 在如下Install界面板中,点击Add按钮: 
 

配置新装插件的地址和名称

7.4.3 然后填入下列字段 
Name: Activiti BPMN 2.0 designer 
Location: http://activiti.org/designer/update/ 
 

 

7.4.4 回到Install界面,在面板正中列表中把所有展示出来的项目都勾上: 
 

 

7.4.5 点击复选框 
在Detail部分记得选中 “Contact all updates sites..” , 因为它会检查所有当前安装所需要的插件并可以被Eclipse下载.

7.4.6 安装完以后,点击新建工程new->Other…打开面板,如果看到下图内容: 
 

 

7.5 结合springboot

7.5.1 安装springboot的插件

 

 

 

 

 

 

 

 

 

 

 

 

7.5.2 maven需要的activiti相关依赖

将下面activiti相关依赖写入pom.xml文件

   

 <dependency>

            <groupId>org.activiti</groupId>

            <artifactId>activiti-engine</artifactId>

            <version>${activiti.version}</version>

        </dependency>

        <dependency>

            <groupId>org.activiti</groupId>

            <artifactId>activiti-spring</artifactId>

            <version>${activiti.version}</version>

        </dependency>

        <dependency>

            <groupId>org.activiti</groupId>

            <artifactId>activiti-bpmn-model</artifactId>

            <version>${activiti.version}</version>

        </dependency>

        <dependency>

            <groupId>org.activiti</groupId>

            <artifactId>activiti-bpmn-converter</artifactId>

            <version>${activiti.version}</version>

        </dependency>

        <dependency>

            <groupId>org.activiti</groupId>

            <artifactId>activiti-json-converter</artifactId>

            <version>${activiti.version}</version>

        </dependency>

        <dependency>

            <groupId>org.activiti</groupId>

            <artifactId>activiti-bpmn-layout</artifactId>

            <version>${activiti.version}</version>

        </dependency>

        <dependency>

            <groupId>org.activiti</groupId>

            <artifactId>activiti-image-generator</artifactId>

            <version>${activiti.version}</version>

        </dependency>

 

7.5.3 activiti.cfg.xml

新增activiti.cfg.xml文件,并写入下方内容

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xmlns:context="http://www.springframework.org/schema/context"

    xmlns="http://www.springframework.org/schema/beans"

    xsi:schemaLocation="http://www.springframework.org/schema/beans

        http://www.springframework.org/schema/beans/spring-beans.xsd

        http://www.springframework.org/schema/context

        http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 配置数据源 -->

    <bean id="dataSource"

        class="org.apache.commons.dbcp2.BasicDataSource">

        <!-- <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>

            <property name="url" value="jdbc:mysql://127.0.0.1:3306/activiti?useUnicode=true&amp;characterEncoding=UTF-8&amp;autoReconnect=true&amp;useSSL=false&amp;serverTimezone=GMT%2B8&amp;allowPublicKeyRetrieval=true"/>

            <property name="username" value="root"/>

            <property name="password" value="123456"/> <property name="maxIdle" value="1"/> -->

 

        <property name="driverClassName"

            value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />

        <property name="url"

            value="jdbc:sqlserver://10.6.30.61:1433;databaseName=activiti" />

        <property name="username" value="SZEContract" />

        <property name="password" value="abc.1234567" />

    </bean>

   

    <!-- Activiti单独运行的ProcessEngine配置 -->

    <bean id="processEngineConfiguration"

    class="org.activiti.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration">

        <!-- 数据源 -->

        <property name="dataSource" ref="dataSource" />

        <property name="databaseSchemaUpdate" value="true" />

        <property name="mailServerHost"

            value="cesp-cas02.**.com.cn" />

        <property name="mailServerPort" value="25" />

        <property name="mailServerDefaultFrom"

            value="***@**.com.cn" />

        <property name="mailServerUsername"

            value="***@**.com.cn" />

        <property name="mailServerPassword" value="***" />

    </bean>

</beans>

 

接下来就是各种activiti包的使用了

八、            Activiti详解

8.1 Activiti数据库表

如下共25张表

 

 

数据库表的命名规则

ACT_EVT_*:' EVT'表示 event,此前缀的表为事件日志。

ACT_GE_*:' GE'表示 general,此前缀的表为通用数据,用于不同场景中。

ACT_HI_*:'HI'表示 history,此前缀的表包含历史数据,如历史(结束)流程实例,变量,任务等等。

ACT_PROCEDF_*:'PROCED'表示 processdefine,此前缀的表为记录流程定义信息。

ACT_RE_*:'RE'表示 repository,此前缀的表包含了流程定义和流程静态资源(图片,规则等等)。

ACT _RU_*:'RU'表示 runtime,此前缀的表是记录运行时的数据,包含流程实例,任务,变量,异步任务等运行中的数据。Activiti只在流程实例执行过程中保存这些数据,在流程结束时就会删除这些记录。

表名

表注释

ACT_EVT_LOG

流程引擎的通用事件日志记录表

ACT_GE_BYTEARRAY

二进制数据表,存储通用的流程定义和流程资源。

ACT_GE_PROPERTY

系统相关属性,属性数据表存储整个流程引擎级别的数据,初始化表结构时,会默认插入三条记录。

ACT_HI_ACTINST

历史节点表

ACT_HI_ATTACHMENT

历史附件表

ACT_HI_COMMENT

历史意见表

ACT_HI_DETAIL

历史详情表,提供历史变量的查询

ACT_HI_IDENTITYLINK

历史流程用户信息表

ACT_HI_PROCINST

历史流程实例表

ACT_HI_TASKINST

历史任务实例表

ACT_HI_VARINST

历史变量表

ACT_PROCDEF_INFO

流程定义的动态变更信息

ACT_RE_DEPLOYMENT

部署信息表

ACT_RE_MODEL

流程设计模型部署表

ACT_RE_PROCDEF

流程定义数据表

ACT_RU_DEADLETTER_JOB

作业死亡信息表,作业失败超过重试次数

ACT_RU_EVENT_SUBSCR

运行时事件表

ACT_RU_EXECUTION

运行时流程执行实例表

ACT_RU_IDENTITYLINK

运行时用户信息表

ACT_RU_INTEGRATION

运行时积分表

ACT_RU_JOB

运行时作业信息表

ACT_RU_SUSPENDED_JOB

运行时作业暂停表

ACT_RU_TASK

运行时任务信息表

ACT_RU_TIMER_JOB

运行时定时器作业表

ACT_RU_VARIABLE

运行时变量信息表

 

 

8.2 Activiti引擎的8大Service接口

RepositoryService:  流程仓库Service,用于管理流程仓库,例如:部署,删除,读取流程资源(bpm信息)

DynamicBpmnService:动态bpmn Service,提供对流程定义和部署存储库的访问的服务。用于动态修改流程中的一些参数信息等,是引擎中的一个辅助的服务。可用于更改流程定义的一部分,而无需重新部署它,例如,你可以在流程定义中更改用户任务的受让人定义,或更改服务任务的类名。

RuntimeService:运行时Service,可以处理所有正在运行状态的流程实例,任务等(发起流程就要用到)

TaskService:任务Service,用于管理,查询任务,例如:签收,办理,指派等

HistoryService:历史Service,可以查询所有历史数据,例如:流程实例,任务,活动,变量,附件等

FormService:表单Service,用于读取和流程,任务相关的表单数据(Activiti7移除)

ManagementService:引擎管理Service,和具体业务无关,主要是可以查询引擎配置,数据库,作业等(跳转节点就要用到)

IdentityService:身份Service,可以管理,查询用户,组之间的关系(Activiti7移除)

 

 

 

 

 

8.3 接口使用

8.3.1 activiti接口服务类获取

ProcessEngineConfiguration configuration = ProcessEngineConfiguration

                .createProcessEngineConfigurationFromResource("activiti.cfg.xml");

ProcessEngine processEngine = configuration.buildProcessEngine();

RepositoryService repositoryService = processEngine.getRepositoryService();

TaskService taskService = processEngine.getTaskService();

RuntimeService runtimeService = processEngine.getRuntimeService();

HistoryService historyService = processEngine.getHistoryService();

ManagementService managementService = processEngine.getManagementService();

DynamicBpmnService dyncBpmnService = processEngine.getDynamicBpmnService();

 

8.3.2 部署

// 进行部署
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("bpmn/**.bpmn") // 添加bpmn资源
.addClasspathResource("bpmn/**.png").name(pName).deploy(); // 部署

 

 

8.3.3 发起流程

// 发起流程
req.variables.put(ComVariableConst.bizId, req.businessKey);

var processInstance = runtimeService
.startProcessInstanceByKey(req.procDefKey, req.businessKey, req.variables);

 

 

8.3.4 设置审批人

DelegateTask 接口中有审批人设置的方法

// 多个人
delegateTask.addCandidateUser(item.account);

// 单人
delegateTask.setAssignee(item.account);

//
delegateTask.addCandidateGroup("软件组");

 

 

8.3.5 待办获取

// 任务负责人

String account = req.account;

String folder = req.folder;

// 查询任务列表,根据流程定义的key和任务负责人

TaskQuery query = taskService.createTaskQuery().processDefinitionKeyLike(folder + "%");

List<Task> taskList = query.taskCandidateUser(account).list();

// 遍历任务列表

for(Task task : taskList) {

System.out.println("----------------------------");

System.out.println("流程定义id = " +task.getProcessDefinitionId());

System.out.println("流程实例id = " + task.getProcessInstanceId());

System.out.println("业务id= " + task.getBusinessKey());

System.out.println("任务id = " + task.getId());

System.out.println("任务名称 = " + task.getName());

System.out.println("----------------------------");

}

 

8.3.6 审批

// 通过
taskService.complete(req.taskId, req.variables);

 

九、            Demo 展示

Demo展示ing….

9.1斗地主并行流程

 

 

 

9.2 自动发消息自动通过流程

 

 

 

9.3 维修报故障流程

 

 

 

 

 

十、            结束

 

 

 

 

 

 

 

 

 

 

 

 

 

 

一个与众不同的结束^_^…..

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2021-10-22 13:37  三个人的酱油  阅读(975)  评论(0编辑  收藏  举报