工作流引擎_工作流引擎activiti - CSDN
  • 几大工作流引擎对比

    千次阅读 2018-09-05 09:04:53
    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012867699/article/details/78866880 纵观jBPM:从jBPM3到jBPM5以及Activiti5:...   工作流引擎选择(为何使用activiti而不是jbp...

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012867699/article/details/78866880

    纵观jBPM:从jBPM3到jBPM5以及Activiti5:http://www.infoq.com/cn/articles/rh-jbpm5-activiti5#

     

    工作流引擎选择(为何使用activiti而不是jbpm):http://blog.csdn.net/classfoo/article/details/20645779

     

    Java工作流引擎:jBPM、Activiti以及SWF:http://blog.csdn.net/liangyixin19800304/article/details/12761573

     

    用OSWorkFlow和JBPM开发工作流异同:http://blog.csdn.net/victor16345/article/details/5614676

     

    JBPM(Java Business Process Management):JAVA业务流程管理,是一个可扩展、灵活、开源的流程引擎, 它可以运行在独立的服务器上或者嵌入任何Java应用中。

     

    几种工作流引擎对比:

     

    1、jBPM3是一个完整的工作流系统实现,面向开发人员,目的在于简化对组织核心流程进行支撑的软件创建,不支持标准。

    2、jBPM4引入PVM,使其拥有更强大的扩展性,同时增加BPMS特性,这些特性包括了对BPMN的支持、面向业务人员的Web建模器和简单统计分析功能的加入。

    3、jBPM5基于原先的Drools Flow,支持BPMN,通过与Drools的合并支持BAM,通过内容仓库增加对流程可视化的支持。由于放弃了jBPM4的PVM,引擎的可扩展性受到损害,并且不再支持jPDL。

    4、Activiti5基于jBPM4的开源工作流系统,与Alfresco的集成增加了其流程可视化与管理能力,同时通过创新的Activiti Cycle协作组件支持流程相关人员之间的协调,最后,它加强了集成能力。

    5、SWF与其说是工作流引擎,不如说是分布式计算调度框架,SWF中只包括Task和History两部分,甚至是每个Task之间如果要传递一些数据的话,都只能通过第三方存储(比如Message Queue或者Redis),不过这也给了编程更大的灵活性,问题是这种灵活性是不是非常需要。

    一个SWF由Worker和Decider组成,Worker执行实际的任务,而Decider进行流程控制,两者严格上来讲没有区别,只是所执行的任务不同罢了。每个Worker和Decider会定期的去SWF的一个Task List取下一个任务。可以看出来这更像是一个“多线程”的结构,而SWF官方网站的Use Case是NASA的火星探索计划中需要处理图片的系统,这其实也是一个更多侧重于计算的系统,流程反而非常简单。

    另外,SWF(Simple Workflow)的一个Workflow不能太复杂,因为所有的流程控制都集中于Decider,如果太复杂的话Decider将无比庞大,给维护和扩展带来一定的困扰。

    Activiti的优势:

    1、与jBPM4相比,Activiti5最令人瞩目的特性就在于它的协作工具组件

     

    • Activiti Modeler—建模器

      基于开源Signavio Web流程编辑器的一个定制版本,提供了对BPMN2.0图形化规范的支持,建模后的流程以文件格式进行存储。

       

      • Activiti probe—管理及监控组件

        对流程引擎运行期实例提供管理及监控的Web控制台。包含部署的管理、流程定义的管理、数据库表的检视、日志查看、事务的平均执行时间、失败多次的工作等功能。

    2、Activiti拥有更简洁健壮的接口

    Activiti中提供TaskQuery接口,可以设置各种查询过滤,排序方式,最终通过list方法执行查询,相比jbpm,它还提供了分页查询功能,双方高下立判。

    3、Activiti拥有更友好的用户体验

    JBPM核心引擎完全没有关于表单的任何抽象,它的工作机制是通过全局常量,流程变量,任务变量,这些概念十分技术化。

    相比之下Activiti则更贴近实际的应用场景,它将为开始节点,以及人工任务提供了表单设置,用户可以设置字段名称,字段类型。通过Activiti的平台可以根据这些设置去生成表单,但如果不使用其平台只使用引擎的话,也支持通过它来表达与第三方表单的关系。这些表单设置的元数据信息也可以通过接口去获取。

    4、Activiti支持启动引擎后随时热部署

    JBPM存在一个软肋,一个RuntimeService只能在启动的时候指定bpmn资源,一旦启动后便不再能够去更新或者增加bpmn了,这会导致我们系统集成的困难,因为我们自然希望整个系统只有一个工作流引擎实例运行。Activiti则提供了Deploy机制,将bpmn资源的热部署,热更新都做了很好的支持

    5、Activiti拥有更友好易用的Eclipse编辑插件和在线插件

    6、Activiti依赖更少的jar包

    Activiti依赖的第三方jar包较少,主要就是mybatics,而JBPM则依赖了一大堆的jar,从drools到繁杂的hibernate,再到自身拆分的零零散散的jar包,让人不由觉得它是一个庞大的怪物。

     

     

    工作流有版本的概念,jBPM和Activiti上传一个新的版本后,版本号会增加1,旧版本还没执行完的流程实例还会继续执行。SWF的版本是个字符串,随意指定好了,这样也很好,字符串名称更明确。

     

    嵌入式部署即将流程引擎嵌入部署于Web应用中

     

    最后,总结一下:

    shark:系统和功能都比较复杂

    Osworkflow:比较灵活的轻量级的框架,但是在流程建模方面不太友好,需要手动编写xml文件去定义流程文件。

    SWF:还有不能支持太复杂的流程

    工作流简介及其6种常用的工作流引擎

    先说说四个非PetriNet调度算法的开源引擎... 4 OBE的引擎调度机制... 4 Shark的引擎调度机制... 5 OSWorkflow的引擎执行机制... 6 JBpm的引擎执行机制......

    展开全文
  • 几大主流工作流引擎对比

    万次阅读 2019-01-30 17:17:00
    一、精选博客 1、纵观jBPM:从jBPM3到jBPM5以及Activiti5 链接 ... 2、工作流引擎选择(为何使用activiti而不是jbpm) 链接 http://blog.csdn.net/classfoo/article/details/20645779 3、Java工作流引擎...

    一、精选博客

    1、纵观jBPM:从jBPM3到jBPM5以及Activiti5  链接 http://www.infoq.com/cn/articles/rh-jbpm5-activiti5#

    2、工作流引擎选择(为何使用activiti而不是jbpm) 链接 http://blog.csdn.net/classfoo/article/details/20645779

    3、Java工作流引擎:jBPM、Activiti以及SWF  链接 http://blog.csdn.net/liangyixin19800304/article/details/12761573

    4、用OSWorkFlow和JBPM开发工作流异同  链接 http://blog.csdn.net/victor16345/article/details/5614676

    二、各工作流引擎简介

    JBPM(Java Business Process Management):JAVA业务流程管理,是一个可扩展、灵活、开源的流程引擎, 它可以运行在独立的服务器上或者嵌入任何Java应用中。

    几种工作流引擎对比:

    1、jBPM3是一个完整的工作流系统实现,面向开发人员,目的在于简化对组织核心流程进行支撑的软件创建,不支持标准。

    2、jBPM4引入PVM,使其拥有更强大的扩展性,同时增加BPMS特性,这些特性包括了对BPMN的支持、面向业务人员的Web建模器和简单统计分析功能的加入。

    3、jBPM5基于原先的Drools Flow,支持BPMN,通过与Drools的合并支持BAM,通过内容仓库增加对流程可视化的支持。由于放弃了jBPM4的PVM,引擎的可扩展性受到损害,并且不再支持jPDL。

    4、Activiti5基于jBPM4的开源工作流系统,与Alfresco的集成增加了其流程可视化与管理能力,同时通过创新的Activiti Cycle协作组件支持流程相关人员之间的协调,最后,它加强了集成能力。

    5、SWF与其说是工作流引擎,不如说是分布式计算调度框架,SWF中只包括Task和History两部分,甚至是每个Task之间如果要传递一些数据的话,都只能通过第三方存储(比如Message Queue或者Redis),不过这也给了编程更大的灵活性,问题是这种灵活性是不是非常需要。

    一个SWF由Worker和Decider组成,Worker执行实际的任务,而Decider进行流程控制,两者严格上来讲没有区别,只是所执行的任务不同罢了。每个Worker和Decider会定期的去SWF的一个Task List取下一个任务。可以看出来这更像是一个“多线程”的结构,而SWF官方网站的Use Case是NASA的火星探索计划中需要处理图片的系统,这其实也是一个更多侧重于计算的系统,流程反而非常简单。

    另外,SWF(Simple Workflow)的一个Workflow不能太复杂,因为所有的流程控制都集中于Decider,如果太复杂的话Decider将无比庞大,给维护和扩展带来一定的困扰。

    Activiti的优势:

    1、与jBPM4相比,Activiti5最令人瞩目的特性就在于它的协作工具组件。

    • Activiti Modeler—建模器

      基于开源Signavio Web流程编辑器的一个定制版本,提供了对BPMN2.0图形化规范的支持,建模后的流程以文件格式进行存储。

    • Activiti probe—管理及监控组件

      对流程引擎运行期实例提供管理及监控的Web控制台。包含部署的管理、流程定义的管理、数据库表的检视、日志查看、事务的平均执行时间、失败多次的工作等功能。

    2、Activiti拥有更简洁健壮的接口

          Activiti中提供TaskQuery接口,可以设置各种查询过滤,排序方式,最终通过list方法执行查询,相比jbpm,它还提供了分页查询功能,双方高下立判。

    3、Activiti拥有更友好的用户体验

    JBPM核心引擎完全没有关于表单的任何抽象,它的工作机制是通过全局常量,流程变量,任务变量,这些概念十分技术化。

    相比之下Activiti则更贴近实际的应用场景,它将为开始节点,以及人工任务提供了表单设置,用户可以设置字段名称,字段类型。通过Activiti的平台可以根据这些设置去生成表单,但如果不使用其平台只使用引擎的话,也支持通过它来表达与第三方表单的关系。这些表单设置的元数据信息也可以通过接口去获取。

    4、Activiti支持启动引擎后随时热部署

    JBPM存在一个软肋,一个RuntimeService只能在启动的时候指定bpmn资源,一旦启动后便不再能够去更新或者增加bpmn了,这会导致我们系统集成的困难,因为我们自然希望整个系统只有一个工作流引擎实例运行。Activiti则提供了Deploy机制,将bpmn资源的热部署,热更新都做了很好的支持

    5、Activiti拥有更友好易用的Eclipse编辑插件和在线插件

    6、Activiti依赖更少的jar包

    Activiti依赖的第三方jar包较少,主要就是mybatics,而JBPM则依赖了一大堆的jar,从drools到繁杂的hibernate,再到自身拆分的零零散散的jar包,让人不由觉得它是一个庞大的怪物。

    工作流有版本的概念,jBPM和Activiti上传一个新的版本后,版本号会增加1,旧版本还没执行完的流程实例还会继续执行。SWF的版本是个字符串,随意指定好了,这样也很好,字符串名称更明确。

    嵌入式部署即将流程引擎嵌入部署于Web应用中

    最后,总结一下:

    shark:系统和功能都比较复杂

    Osworkflow:比较灵活的轻量级的框架,但是在流程建模方面不太友好,需要手动编写xml文件去定义流程文件。

    SWF:还有不能支持太复杂的流程

    展开全文
  • 工作流引擎简介

    2019-08-17 23:34:59
    工作流引擎,是指workflow作为应用系统的一部分,并为之提供对各应用系统有决定作用的根据角色、分工和条件的不同决定信息传递路由、内容等级等核心解决方案。 工作流引擎包括流程的节点管理、流向管理、流程样例...

    概念

    工作流引擎,是指workflow作为应用系统的一部分,并为之提供对各应用系统有决定作用的根据角色、分工和条件的不同决定信息传递路由、内容等级等核心解决方案。
    工作流引擎包括流程的节点管理、流向管理、流程样例管理等重要功能。

    工作流引擎能够解决什么问题?

    开发一个优秀的软件系统,系统界面是基础,数据库之间的信息交换是必备条件,而根据业务需求开发出符合实际的程序逻辑,并在一定程度上保证其稳定性、易维护性才是根本。稳定性就不用说了,易维护性则要保证模块化和结构化,这样可以在业务流程发生变化,例如决策权的改变、组织结构的变动时产生的全新业务逻辑,如果应用程序缺乏强大的逻辑层,就会变得容易出错,比如信息的路由错误、死循环等,而工作流引擎解决的就是这个问题。

    体系架构

    面向服务的体系结构,是一个组件模型,它将应用程序的不同功能单元通过这些服务之间定义良好的接口和契约联系起来。接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台、操作系统和编程语言。工作流引擎使得构建在各种这样的系统中的服务,可以以一种统一和通用的方式进行交互。

    展开全文
  • 工作流引擎

    千次阅读 2018-03-05 20:47:04
    1.什么是Activiti在解释activiti之前我们看一下什么是工作流工作流(Workflow),就是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档、信息...

    1.什么是Activiti

    在解释activiti之前我们看一下什么是工作流。
    工作流(Workflow),就是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档、信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现”。
    我的理解是,工作流将一套大的业务逻辑分解成业务逻辑段, 并统一控制这些业务逻辑段的执行条件,执行顺序以及相互通信。 实现业务逻辑的分解和解耦。
    Activiti是一个开源的工作流引擎,它实现了BPMN 2.0规范,可以发布设计好的流程定义,并通过api进行流程调度。
    BPMN即业务流程建模与标注(Business Process Model and Notation,BPMN) ,描述流程的基本符号,包括这些图元如何组合成一个业务流程图(Business Process Diagram)。

    BPMN的流程图长这样子

     

    activiti5.13使用了23张表支持整个工作流框架,底层使用mybatis操作数据库。这些数据库表为


    1)ACT_RE_*: 'RE'表示repository。 这个前缀的表包含了流程定义相关的静态资源(图片,规则等)。
    2)ACT_RU_*: 'RU'表示runtime。 运行时表,包含流程实例,任务,变量,异步任务等运行中的数据。流程结束时这些记录会被删除。
    3)ACT_ID_*: 'ID'表示identity。 这些表包含用户和组的信息。
    4)ACT_HI_*: 'HI'表示history。 这些表包含历史数据,比如历史流程实例,变量,任务等。
    5)ACT_GE_*: 通用数据,bytearray表保存文件等字节流对象。

    工作流进行的基本过程如下:
    定义流程(框架外) -> 部署流程定义 -> 启动流程实例, 框架移动到任务1 -> 拾取组任务 -> 办理个人任务, 框架移动到任务2 -> 拾取组任务 -> 办理个人任务...

    组任务是多个用户都可以完成的任务。没有组任务直接办理个人任务; 有组任务需先通过拾取将组任务变成个人任务, 然后再办理。

    个人任务/组任务在表中的区别

    个人任务: 表act_ru_task的ASSIGNEE段即指定的办理人

    组任务: 表act_ru_task的ASSIGNEE段为null, 相关信息在表act_ru_identitylink中, 组任务1见userid段;  组任务2见groupid段, 当然还需查询act_id_xxx表才能精确到人.

     

    2.Activiti的使用

    2.1 创建processEngine

    processEngine控制着工作流整个流程

    复制代码
    public class processEngine {
        @Test
        public void createProcessEngine1() {
            String resource = "activiti-context.xml";    // 配置文件
            String beanName = "processEngineConfiguration";  // 配置文件中bean name
            // 从配置文件创建配置对象
            ProcessEngineConfiguration config = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(resource, beanName);
            // 根据配置创建引擎对象
            ProcessEngine processEngine = config.buildProcessEngine();
        }
    
        /**
         *  一条语句创建processEngine, 要求:
         * 1、配置文件必须在classpath根目录下
         * 2、配置文件名必须为activiti-context.xml或activiti.cfg.xml
         * 3、工厂对象的id必须为processEngine
         */
        @Test
        public void createProcessEngine2() {
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        }
    }
    复制代码
    复制代码
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        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-2.5.xsd
      http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
        <!-- 配置 -->
        <bean id="processEngineConfiguration"
             class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
            <property name="jdbcDriver"  value="com.mysql.jdbc.Driver"/>
            <property name="jdbcUrl"  value="jdbc:mysql:///test_activiti"/>
            <property name="jdbcUsername"  value="root"/>
            <property name="jdbcPassword"  value="root"/>
            <!-- 创建processEngine时, activiti自动创建23张表 -->
            <property name="databaseSchemaUpdate" value="true"/>
        </bean>
        <!-- 使用配置创建引擎对象 -->
        <bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
            <property name="processEngineConfiguration" ref="processEngineConfiguration"/>
        </bean>
    </beans>
    复制代码

    当然, 可以与spring进一步整合, 使用spring方式获取processEngine.  applicationContext.xml如下

    复制代码
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        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-2.5.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
        <bean id="dataSource"
            class="org.springframework.jdbc.datasource.DriverManagerDataSource">
            <property name="driverClassName" value="com.mysql.jdbc.Driver" />
            <property name="url" value="jdbc:mysql:///activiti_day2" />
            <property name="username" value="root" />
            <property name="password" value="root" />
        </bean>
        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource"/>
        </bean>
        <!-- 流程引擎配置对象 -->
        <bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
            <!-- 注入数据源 -->
            <property name="dataSource" ref="dataSource"/>
            <!-- 注入事务管理器对象 -->
            <property name="transactionManager" ref="transactionManager"/>
            <property name="databaseSchemaUpdate" value="true" />
        </bean>
        <bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
            <property name="processEngineConfiguration" ref="processEngineConfiguration" />
        </bean>
    </beans>
    复制代码

     

    2.2 部署流程定义

    流程是由用户通过bpmn等文件(底层xml)定义的, 即上面列举的的bpmn流程图

    定义好的流程需要部署给activiti才能被其使用

    复制代码
       /**
         * 部署流程定义 
         * 一套定义文件只有一个流程定义Key, 但可以被部署多次形成多个版本(部署表里多个id和流程定义表里多个id)
         * 涉及的表:act_re_deployment(部署表)、act_re_procdef(流程定义表)、act_ge_bytearray(二进制表)
         */
        @Test
        public void test() throws FileNotFoundException {
            DeploymentBuilder deploymentBuilder = processEngine.getRepositoryService().createDeployment();
            // 逐个文件部署
            // deploymentBuilder.addClasspathResource("qjlc.bpmn");
            // deploymentBuilder.addClasspathResource("qjlc.png");
            // 压缩文件打包部署, 推荐
            ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(new File("d:\\processDef.zip")));
            deploymentBuilder.addZipInputStream(zipInputStream );
            
            Deployment deployment = deploymentBuilder.deploy();
        }
    复制代码

     

    2.3 启动流程实例

    复制代码
         /**
         * 启动一个流程实例
         * 涉及的表:
         * act_ru_execution(流程实例表), 管理流程进度
         * act_ru_task(任务表), 进行到哪一个流程的哪一个任务, 该由谁完成
         */
        @Test
        public void test() throws Exception{
            String processDefinitionKey = "qjlc";
            //方式一:根据流程定义id启动流程实例
            //String processDefinitionId = "qjlc:6:904";
            //ProcessInstance processInstance = processEngine.getRuntimeService().startProcessInstanceById(processDefinitionId);
            
            //方式二:根据流程定义Key启动流程实例   推荐!流程定义有多个版本时会选择最新版本
            ProcessInstance processInstance = processEngine.getRuntimeService().startProcessInstanceByKey(processDefinitionKey);
        }        
    复制代码

     

    2.4 办理任务

    复制代码
      /**
        * 办理任务, 办理后框架自动移动到下一任务
        * 涉及的表: act_ru_execution(流程实例表)、act_ru_task(任务表)
        */
        @Test
        public void test() throws Exception{
            String taskId = "1304";
            processEngine.getTaskService().complete(taskId);
        }
    复制代码

     

    2.5 其他操作

    复制代码
       /**
        * 查询流程定义
        * 涉及的表:act_re_procdef
        */
        @Test
        public void test(){
            ProcessDefinitionQuery query = processEngine.getRepositoryService().createProcessDefinitionQuery();
            // 查询条件过滤
            query.processDefinitionKey("qjlc");
            query.orderByProcessDefinitionVersion().asc();
            List<ProcessDefinition> list = query.listPage(0, 10);
            for (ProcessDefinition processDefinition : list) {
                System.out.println(processDefinition.getId());
            }
        }
    复制代码

    activiti中查询的套路:  processEngine.getXXXService().createXXXQuery().list()/singleResult()
    processEngine.getRepositoryService().createDeploymentQuery().list(); // 查询部署
    processEngine.getRuntimeService().createProcessInstanceQuery().list(); // 查询流程实例
    processEngine.getTaskService().createTaskQuery().list(); // 查询个人任务 
    processEngine.getIdentityService().createUserQuery().list(); // 查询用户
    processEngine.getHistoryService().createHistoricActivityInstanceQuery().list(); //查询历史
    过滤条件
    查询个人任务 query.taskAssignee()
    查询组任务    query.taskCandidate()

    几个javabean(和表对应):
    Deployment------act_re_deployment
    ProcessDefinition-----act_re_procdef
    ProcessInstance------act_ru_execution
    Task-----act_ru_task
    几个Query对象
    DeploymentQuery------act_re_deployment
    ProcessDefinitionQuery-----act_re_procdef
    ProcessInstanceQuery------act_ru_execution
    TaskQuery-----act_ru_task
    几个Service
    RepositoryService----操作部署表、流程定义表等静态资源信息表
    RuntimeService----操作流程实例表、任务表等动态信息表
    TaskService-----操作任务表
    HistoryService----操作历史表
    IdentityService----操作用户表、组表、关系表

    复制代码
      // 删除流程定义
        @Test
        public void test1(){
            String deploymentId = "101";  //部署id
            boolean cascade = false;  // 级联删除, 设置为true的话, 有正在跑的流程实例及任务也会被删除
            processEngine.getRepositoryService().deleteDeployment(deploymentId, cascade);
        }
        // 删除流程实例
        @Test
        public void test2() throws Exception{
            String processInstanceId = "1201";
            String deleteReason = "不请假了";  // 可以添加删除原因
            processEngine.getRuntimeService().deleteProcessInstance(processInstanceId, deleteReason);
        }
      // 根据部署id, 获取定义文件
        @Test
        public void test3() throws Exception{
            String deploymentId = "201"; //部署id
            // 先获得定义文件的名字
            List<String> names = processEngine.getRepositoryService().getDeploymentResourceNames(deploymentId);
            for (String name : names) {
                InputStream in = processEngine.getRepositoryService().getResourceAsStream(deploymentId, name);
                FileUtils.copyInputStreamToFile(in, new File("d:\\"+name));
                in.close();
            }
        }
        // 根据流程定义id, 获取定义文件
        @Test
        public void test4() throws Exception{
            String processDefinitionId = "qjlc:6:904"; //流程定义id
            InputStream pngStream = processEngine.getRepositoryService().getProcessDiagram(processDefinitionId);
            FileUtils.copyInputStreamToFile(pngStream, new File("d:\\abc.png"));
        }
    复制代码

    通过javabean能访问到某些需要的字段, 例如

    processInstance.getActivityId() -> 当前执行的任务名

    processDefinition.getDiagramResourceName() -> 定义文件中图片的名字

     

    2.6  流程变量

    多个任务间可以通过流程变量通信.

    流程变量以key-value形式存放, 存于表 act_ru_variable. 在同一流程实例里, 不同方式设置变量, key相同时会覆盖

    复制代码
        // 启动流程实例时 设置流程变量
        @Test
        public void test1() {
            String processDefinitionKey = "bxlc";
            Map<String, Object> variables = new HashMap<String, Object>();
            variables.put("key", "value");
            ProcessInstance pi = processEngine.getRuntimeService().startProcessInstanceByKey(processDefinitionKey, variables);
        }
        // 办理任务时 设置流程变量, 更实用!
        @Test
        public void test2() {
            String taskId = "206";
            Map<String, Object> variables = new HashMap<>();
            variables.put("key", "value");
            processEngine.getTaskService().complete(taskId, variables);
        }
        // 通过RuntimeService 设置流程变量
        @Test
        public void test3() {
            String executionId = "201"; // 流程实例id
            Map<String, Object> variables = new HashMap<>();
            variables.put("key", "value");
            //processEngine.getRuntimeService().setVariable(executionId, variableName, value);
            processEngine.getRuntimeService().setVariables(executionId, variables);
        }
        // 通过TaskService 设置流程变量
        @Test
        public void test4() {
            String taskId = "304";
            String key = "key";
            Object value = "value";
            processEngine.getTaskService().setVariable(taskId , key, value);
        }
    复制代码

     

    复制代码
    // 通过RuntimeService 获取流程变量
        @Test
        public void test5() {
            String executionId = "201";
            Object value = processEngine.getTaskService().getVariable(executionId, "user");
            System.out.println(value);
        }
         // 通过TaskService 获取流程变量
        @Test
        public void test6() {
            String taskId = "304";
            Object value = processEngine.getTaskService().getVariable(taskId, "user");
            System.out.println(value);
        }
    复制代码

    流程变量还可以通过在定义流程用表达式${}.  框架在该段任务执行前从act_ru_variable表里动态获取

    另外, 启动流程实例还有一个重载函数, 除了流程变量variables还能指定业务主键businessKey

    processEngine.getRuntimeService().startProcessInstanceByKey(processDefinitionKey, businessKey, variables);

    businessKey一般设置为业务表的主键值, 在使用activiti的时候, 通过查询业务表主键, 能方便地查询出业务的最新状态

     

     

    2.7  组任务

     

    组任务1

    复制代码
      // 查询组任务
        @Test
        public void test1() {
            TaskQuery query = processEngine.getTaskService().createTaskQuery();
            // 使用候选人查询组任务
            String candidateUser = "财务二";
            query.taskCandidateUser(candidateUser);
            List<Task> list = query.list();
            for (Task task : list) {
                System.out.println(task.getId());
            }
        }
        // 拾取组任务
        @Test
        public void test2() {
            String taskId = "1102";
            processEngine.getTaskService().claim(taskId , "财务二");
        }
        // 办理组任务, 无需指定办理人
        @Test
        public void test3() throws Exception{
            String taskId = "1102";
            processEngine.getTaskService().complete(taskId);
        }
    复制代码

    组任务2

    复制代码
      // activiti使用自己的用户与组的权限表, 因此需要设置. 但需注意要与框架外用户/组同步设置
        @Test
        public void test2() {
            // 创建组
            Group group = new GroupEntity();
            group.setId("财务组");
            processEngine.getIdentityService().saveGroup(group);
            // 创建用户
            User user = new UserEntity();
            user.setId("2");
            processEngine.getIdentityService().saveUser(user);
            // 维护用户与组的关系
            processEngine.getIdentityService().createMembership("2", "财务组");
        }
        // 查询组任务
        @Test
        public void test2() {
            TaskQuery query = processEngine.getTaskService().createTaskQuery();
            String candidateUser = "2";
            // 使用候选人过滤
            query.taskCandidateUser(candidateUser);
            // 使用组过滤
            //query.taskCandidateGroup("财务组");
            List<Task> list = query.list();
            for (Task task : list) {
                System.out.println(task.getId());
            }
        }
        // 拾取组任务
        @Test
        public void test3() {
            String taskId = "1902";
            processEngine.getTaskService().claim(taskId , "2");
        }
        // 办理组任务略
    复制代码

     

    2.8 排他网关

    设置分支条件

     

    3. 一些使用经验

    1)

    考虑到工作流中的一个任务, 对应一个业务段, 可以将taskDefinitionKey设置成strus action类的method, 使之具有一定的通用性

    2)

    两种对流程定义的查询, 后者能获得更多定义的细节信息  processDefinitionEntity.findActivity(taskId) 工作流中某任务的信息

    repositoryService.createProcessDefinitionQuery().processDefinitionId(processDefinitionId).singleResult()

    (ProcessDefinitionEntity) repositoryService.getProcessDefinition(processDefinitionId)

    展开全文
  • 常用几种工作流引擎介绍

    千次阅读 2018-07-17 14:29:36
    工作流是业务流程的全部或部分自动化,在此过程中,文档、信息或任务按照一定的过程规则流转,实现组织成员间的协同工作,以达到业务的整体目标。 工作流管理系统是支持企业... 常用的工作流引擎有osworkflow,jbpm,s...
  • 常用的工作流引擎

    千次阅读 2018-06-03 00:31:46
    https://blog.csdn.net/liuwenbiao1203/article/details/53158254
  • 三分钟了解Activity工作流引擎

    千次阅读 2018-09-05 09:04:59
    一、 什么是工作流 以请假为例,现在大多数公司的请假流程是这样的 员工打电话(或网聊)向上级提出请假申请——上级口头同意——上级将请假记录下来——月底将请假记录上交公司——公司将请假录入电脑 采用工作...
  • 工作流引擎Activiti使用总结

    万次阅读 2013-11-26 11:26:53
    转载自:工作流引擎Activiti使用总结 1.简单介工作流引擎与Activiti 对于工作流引擎的解释请参考百度百科:工作流引擎 1.1 我与工作流引擎 在第一家公司工作的时候主要任务就是开发OA系统,当然基本都是有...
  • 现在,办公要流程化,营销也有流程,流程现在已经是各种...所谓工作流引擎是指workflow作为应用系统的一部分,并为之提供对各应用系统有决定作用的根据角色、分工和条件的不同决定信息传递路由、内容等级等核心解决...
  • 工作流引擎的设计与实现

    千次阅读 2019-04-01 10:35:51
    工作流引擎的设计与实现 工作流引擎的作用是解释流程定义,创建、执行和控制流程实例。对于本项目研究来讲,工作流引擎要接受外部请求事件,并按照业务过程的需要执行响应动作。具体来讲,包括接受工作人员启动业务...
  • 所谓工作流引擎是指workflow作为应用系统的一部分,并为之提供对各应用系统有决定作用的根据角色、分工和条件的不同决定信息传递路由、内容等级等核心解决方案。工作流引擎包括了,流程的节点管
  • Activiti工作流引擎使用详解

    万次阅读 2017-05-12 16:01:13
    Activiti工作流引擎使用 1.简单介工作流引擎与Activiti 对于工作流引擎的解释请参考百度百科:工作流引擎 1.1 我与工作流引擎 在第一家公司工作的时候主要任务就是开发OA系统,当然基本都是有工作流...
  • 工作流引擎是用来实现工作流的一种组件化工具,它是一整套解决方案,比如说一般工作流引擎包含这些功能:流程节点管理、流向管理等,是为了减小开发成本而推出的。因为在软件开发过程中,如果是从零开始实现工作流,...
  • 力软敏捷框架开发工作流引擎设计

    千次阅读 2019-06-12 18:38:07
    在C#下我们自己研发工作流引擎等,在.net下却几乎找不到令人满意的工作流引擎可用,当然不是说.net下没有开源的只是有些国产开源的但看了代码后就一点兴趣都没有,且不说代码质量如何,还引入了一大堆东西,想在项目...
  • 通用工作流引擎数据库设计的简单构思

    万次阅读 多人点赞 2017-03-08 00:46:18
    什么是工作流和工作流引擎百度百科: 工作流(Workflow),指“业务过程的部分或整体在计算机应用环境下的自动化”。是对工作流程及其各操作步骤之间业务规则的抽象、概括描述。在计算机中,工作流属于计算机支持的...
  • Java三大主流开源工作流引擎分析

    万次阅读 2016-08-09 14:28:40
    三大主流工作流引擎:Shark,osworkflow,jbpm的比较和选择。
  • 浅谈工作流引擎

    千次阅读 2016-02-23 14:35:10
    浅谈工作流引擎一、工作流相关概念 工作流(Workflow)是对工作流程及其各操作步骤之间业务规则的抽象、概括描述。工作流建模,即将工作流程中的工作如何前后组织在一起的逻辑和规则,在计算机中以恰当的模型表达并对...
  • Zeebe是一个为云架构而构建的现代工作流引擎,可提供对跨多个微服务的工作流的可见性和控制。 Zeebe与Kubernetes,Apache Kafka和Elasticsearch等云原生组件集成,执行行业标准BPMN(业务流程模型和表示法),这是...
  • JAVA工作流引擎(J-RoadFlow) J-RoadFlow工作流平台是知名的.NET工作流引擎RoadFlow的JAVA移植版。该工作流平台由从事多年OA和工作流实施及开发的团队研发, 采用最简单的SM架构实现大中小企业中日常复杂业务流程...
  • 我们都知道工作流引擎在系统开发上起到了举足轻重的地位,那么如何很好的设计一个自己的工作流引擎,我们今天就简单从数据库设计方面,谈谈流引擎设计。 下面我们就以Tpflow工作流引擎的数据库设计来跟大家聊聊。 ...
1 2 3 4 5 ... 20
收藏数 191,074
精华内容 76,429
关键字:

工作流引擎