Activiti工作流-进阶

流程变量

流程变量非常重要,临时存储一些变量,该变量一般是与具体业务相关的,也可以是任意想保存的,比如后面用流程跳转,也无需要流程变量;
流程变量就是工作流对业务进行交流的一个途径,窗口。

主要功能(类似一个Map):
- 存放基本的业务信息,比如主键,基本字段值
- 存放临时的判断用的变量,用来判断连线走向等等
- 存放动态的办理人,运行的时候可以做到办理人动态指定
- ….

流程变量的基本使用

  • 一种是在启动流程的时候保存了变量和值,比如,保存了一个业务表的主键id。
  • 一种是在任务运行中保存了变量和值,比如保存一些临时业务信息以及判断连线走向的信息。

启动流程的同时保存变量

        //流程变量
        //在启动流程的时候同时保存一个变量
        @Test
        public void setVarOnStart(){
            //参数2:就是流程变量,结果是map,里面是key和value
            Map<String, Object> variables = new HashMap<>();
            //保存公司的名字
            variables.put("username", "张三");
            //。。。。放入nduo的变量--全局的变量
            runtimeService.startProcessInstanceByKey("LeaveProcess", variables);
        }

任务执行过程中随时保存变量

        //在任务流转过程中设置变量
        @Test
        public void setVarOnTask(){
            //某个任务,从数据库查询出来一个值,根据这个值,判断 是否走下一个节点
    //      taskService.setVariable(taskId, variableName, value);//key:value
    //      taskService.setVariables(taskId, variables);//map

            //某个任务节点设置一个变量:(全局的变量)
            taskService.setVariable("2505", "age", 18);
            taskService.setVariable("2505", "name", "Rose");
            taskService.setVariable("2505", "birthday", new Date());
            taskService.setVariable("2505", "简历", new User(1001,"Jack","123456"));
        }

获取流程变量(使用运行时和任务api均可)

        //获取流程变量
        @Test
        public void getVar(){
            //在流程运行过程中随时可以取出,任意的变量,那条线中的变量
            //参数1:执行id,参数2:变量名字
            String company =(String) runtimeService.getVariable("2501", "company");
            System.out.println(company);
            //在任意的任务中获取:该任务可拥有的
            //参数1:任务id,参数2:变量的名字
            String company2 =(String)taskService.getVariable("2505", "company");
            System.out.println(company2);

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

            System.out.println(runtimeService.getVariable("2501", "name"));
            System.out.println(runtimeService.getVariable("2501", "age"));
            System.out.println(runtimeService.getVariable("2501", "birthday"));
            System.out.println(runtimeService.getVariable("2501", "简历"));//反序列化回来了
        }

连线

连线—SequenceFlow,连线的作用:告诉工作流引擎,流程该怎么走。

编写画流程图

对于工作流系统,开始节点必须且只能有一个,结束节点必须有但可以有多个。
换句话:流程的发起,只能是从一个点。结束,可以有多个。
大部分流程都是一个开始,一个结束。一般是谁申请,谁最后确认。
设置连线的条件:
在Condition中设置一个布尔值,里面的表达式可以用{}或者#{},如:{msgtype==’不重要’}

测试流程

    //个人任务办理
    @Test
    public void completePersonTask2(){
        Map<String, Object> variables=new HashMap<String, Object>();
        variables.put("msgtype", "重要");
        taskService.complete("5002", variables);
    }

要点:使用流程变量控制连线的走向。
缺点:不容易清晰的描绘出分支的走向,尤其是并行或排他业务,得靠大量变量来判断。

网关(并行、排他、包含)

网关—Gateway,主要是用来控制分支流程的。并行(必须同时走多根),排他的(只能走一根),包含的走法(可以走多根,也可以走一根)。

1.并行网关—Parallel Gateway

测试流程

部署流程定义
发布流程定义
查询个人任务
完成个人任务

小结

1)一个流程中流程实例只有1个(启动一次,只能生成一个实例),执行对象有多个(有分支,同时在跑)
活动:任意的一个节点都是活动。包含用户任务。
用户任务:方块(用户任务,带小人,其他的任务,工作流不认为是用户任务),
2)并行网关的功能是基于进入和外出的顺序流的:
分支(fork): 并行后的所有外出顺序流,为每个顺序流都创建一个并发分支(执行对象)。
汇聚(join): 所有到达并行网关,在此等待的进入分支, 直到所有进入顺序流的分支都到达以后, 流程就会通过汇聚网关。(只有全部汇聚后,流程才能真正通过并行网关)
3)并行网关的进入和外出都是使用相同节点标识(jbpm是用了两种节点图标)
4)如果同一个并行网关有多个进入和多个外出顺序流, 它就同时具有分支和汇聚功能。 这时,网关会先汇聚所有进入的顺序流,然后再切分成多个并行分支。
5)并行网关不会解析条件。 即使顺序流中定义了条件,也会被忽略。
6)并行网关不需要是“平衡的”(比如, 对应并行网关的进入和外出节点数目不一定相等)。如图中标示是合法的:

排他网关—Exclusive Gateway

无论如何,只会走一条线。

排他网关和直接连线的最大区别:排他网关有个默认值,连线必须是每根先都得给条件。
排他网关必须给流程变量,当判断结果没有符合条件的话,就会走默认的连线。不给流程变量,会报错,因为无法判断。
连线:如果给流程变量,按照流程变量的判断走,没有默认指定的连线。可以不给流程变量,也会走个默认(先画的那根线,不容易控制)
两者根据实际情况,都可以选择。

包含网关—Inclusive Gateway

相当于并行+排他。

inclusiveGateway与 exclusiveGateway的区别
- exclusiveGateway 只会寻找唯一一条能走完的flow,也就是说当有一个flow可以走通的情况下,它不会再次去寻找第二条可以走通的flow ,如是没有符合条件的,就走defalut的flow。
- inclusiveGateway 会寻找所有符合条件的 flow,也就是说他会走完所有的符合条件的flow,如果没有符合的,那么就去走defalut的flow。

包含网关可以使用并行+排他来代替。

任务

常用任务

常用的task,有如下几个:
- User Task:用户任务,需由用户(参与者、必须有办理人)来完成任务。
- Java Service Task:服务任务,也称之为自动节点任务,当运行到该类型的任务节点的时候,会自动执行一个Java类(需实现一个接口)的一个方法。(发短信、处理数据等)
- Jave Receive Task:接收任务,也称之为等待任务,需手动来完成任务(调一个方法)。

任务中除了用户任务,有参与者(人),其他都没有参与者。

    //服务任务的代理类:用来自动执行一段代码
    public class MyServiceJavaDelegate implements JavaDelegate{

        @Override
        //命令模式
        public void execute(DelegateExecution execution) throws Exception {
            //do something
            //当节点走到这里的的时候,会自动调用这个方法,执行里面的逻辑,无需人工参与
            System.out.println("服务节点(自动节点)正在执行");
        }

    }

为服务任务指定服务的类

告知完成(等待)任务:

        //调用执行等待任务(一般是嵌入到程序的一段代码中):告知任务
        @Test
        public void signalTask(){
            //申明告知:告诉工作流,我程序已经处理完了,你继续走流程
            runtimeService.signal("2501");
        }

等待任务没有具体的参与人。
流程的某个任务,是在程序里面运行的一部分。
比如,我们需要写一个业务保存用户业务,但保存该用户之前,需要走一段流程,在流程的某个节点,我才有资格保存该用户,而且保存完了之后,还有后面流程。在保存用户的逻辑的地方调用一个方法就行。
换句话说,该任务,就等着程序去调用他(某些业务操作后),之后,才能往下走。

用户任务—UserTask

根据任务办理人的特点,分为两大类:个人任务和群组任务
用户任务必须由人(参与者)来完成。

个人任务的分配

某个人物节点是由一个具体的人来完成的.

个人任务可以通过三种方式指定办理人
- 为assignee属性指定固定办理人(不常用)
- 为assignee属性指定“变量”(动态)办理人,即通过变量,在程序运行过程中,通过设置变量来动态指定办理人。
- 通过task listeners来动态指定办理人。操作:我们需要实现一个接口,写个类,类里面有个方法,方法中设置该节点的办理人。在画节点的时候,无需指定办理人。办理人会在进入到该节点之前,被lisener监听掉,调用上面的方法,设置进去办理人。

  • 在任务节点指定办理人,使用变量的方式,变了名字叫:initiator(发起人)
  • 在开始节点上设置发起人的变量名字
  • 为中间节点,使用task listeners来指定class
        //用户任务的监听(当走到该节点的时候会自动调用该监听)
        public class MyUserTaskListener implements TaskListener{

            @Override
            //将原来的任务包装
            public void notify(DelegateTask delegateTask) {
                //设置办理人:一般实际开发的后,需要从组织机构 树中获取领导来审批
                delegateTask.setAssignee("张三");
            }

        }

2.测试流程
部署流程:(略)
启动流程:(略)
添加spring注入:

        //注入用户service
        private IdentityService identityService;

    //用户任务--个人任务
        //启动流程
        @Test
        public void startProceeInstanceForPerson(){
            //使用任务用户id来进行给变量赋值
            //调用该方法之前,需要在开始节点告诉工作流,你的认证用户所使用的变量是谁?
            identityService.setAuthenticatedUserId("张三");//当前登录人

            runtimeService.startProcessInstanceByKey("myProcess");
            //在启动的时候加一个变量initiator发起人--map
    //      runtimeService.startProcessInstanceByKey(processDefinitionKey, variables)
        }

完成个人任务:(略)
发起人在一个流程中一般参与的较多。

群组任务(候选人candidate)的分配

一个任务节点是由一堆人来完成的,不需要直接指定具体的某个人。但最终还是由某个具体人来完成。

群组任务可以通过两大类(各三种方式)指定:
第一类:候选人列表:
- 为Candidate Users属性指定固定的群组人员。
- 为Candidate Users属性指定 “变量”(动态)群组人员,即通过变量,在程序运行过程中,通过设置变量来动态指定群组。
- 通过task listeners在程序中动态的来指定群组人员。

第二类:候选人群组编号(人员和组、关系,都是工作流表中给你设计好了。)
- 为Candidate groups属性指定固定的群组id,该群组中包含群组人员。
- 为Candidate groups属性指定“变量”(动态)的群组id。
- 通过task listeners在程序中动态的来指定群组id。

第二类方式以前都不用。原因是:实际业务开发的时候,组织机构、人员信息,都是由业务系统维护的。

代码略

其他api

历史记录的查询—HistoryService

<!-- 历史Service -->
<bean id="historyService" factory-bean="processEngine" factory-method="getHistoryService"/>

本地SQL查询—NativeSQL

<!-- 管理Service -->
<bean id="managementService" factory-bean="processEngine" factory-method="getManagementService"/>
    @Test
    public void queryByNativeSQL(){
        //当默认的api不能满足你的时候,你可以自定义sql语句进行查询
        List<HistoricTaskInstance> list = historyService.createNativeHistoricTaskInstanceQuery()
        // .sql("select * from act_hi_taskinst")//必须传入sql
        .sql("select * from "+managementService.getTableName(HistoricTaskInstance.class))//不知道对象对应的表名,怎么办
        .list();
        for (HistoricTaskInstance historicTaskInstance : list) {
            System.out.println("历史的任务名称:"+historicTaskInstance.getName());
        }
    }

表单操作—FormService

业务关联工作流系统:
1.使用流程变量:存放业务表的表名#id,比如t_leave#1001
2.businiessKey(就是变量),和流程变量做法一样
3.formKey
主要用于实现动态表单。(每一个节点的表单页面都不一样)

<!-- 表单Service -->
<bean id="formService" factory-bean="processEngine" factory-method="getFormService"/>

方法1:
表单由工作流创建和管理(开始节点或任务节点):

程序中可以获取表单

        formService.getStartFormData(processDefinitionId);//申请表单的数据
        formService.getTaskFormData(taskId);//任务表单数据

方法2:
表单由应用程序创建和管理,工作流通过表单的url(form key)来引用
在应用程序中,可以获取该key,从而知道表单的url

        formService.getStartFormKey(processDefinitionId);
        formService.getTaskFormKey(processDefinitionId, taskDefinitionKey);//将得到url,放到响应中
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
宏天BPM X3软件平台是一个易于部署和使用的新一代业务程管理平台,能够以最快的速度帮助您梳理、设计、执行、监控分析和优化业务程,从业务和IT相结合的完美视角为用户组建长期而久远的卓越BPM程管 理架构。通过实施BPM方案让您的企业在运营效率、透明度、控制力和敏捷性方面迅速受益。 BPMX3是基于J2EE开源、轻量级的企业业务开发平台,基于代码重用、组件重用、业务逻辑重用、组装重用,结合快速开发平台中的工具,将开发人员从重复的代码编写中解放出来,把更多的精力集中解决客户的业务逻辑处理上。 BPMX3是支持程管理、监控、优化、再造的全套IT管理开发平台,并且集单点登录、企业单位门户、业务程管理、开发、整合、业务分析及重构等多重职能于一身的软件开发工具和企业IT架构平台。 BPMX3是企业管理业务的创新关键,可以帮忙用户更科学、更有效管理企业业务的各个环节,企业通过BPMX3可以明显实现业务的高效运营。同时,由于其架构的开放性,采用业界开放性的技术及程标准,使其能够成为企业SOA架构的程基础平台及开发平台,越来越多的企业更偏向采用开源的平台来解决其内部的信息化平台的要求,BPMX3却允许更多的平台系统接入及自身扩展更多的功能,以满足更多的企业不同的个性化的需求,以达到最大满足最终的客户使用要求。 【图一】工作引擎中心 1.BPMX3的特点 1.是一个开放式、轻量级的开发平台 2.BPMX3多层系统架构 3.基于模板代码生成 4.丰富的报表展示 5.跨数据库的数据访问支持 6.简易的前端使用 7.参照最新的BPMN2标准设计 8.满足中国特色程需求 9.在线的可视化程设计、可视化的程监控 10.完全独立的程引擎服务,可与其他系统无缝集成 11.基于行的JAVA 程引擎Activiti 5.8扩展 12.灵活的在线程定义 13.灵活的嵌入式部署、独立部署 14.灵活的在线表单定义及版本管理(支持按内表及外部表及视图生成表单) 15.灵活的第三方表单集成 16.开放式的程体系 17.灵活的组织结构支持 18.程的导入与导出 19.子程支持 20.程任务逐步回退处理(任务追回及多驳回 ) 21.程自由跳转 22.程跳转业务规则设置 23.多级分发任务与任务汇总 24.会签(并行与串行)、补签及投票处理 25.程版本变更管理 26.程催办(基于MQ短信及邮件设置) 27.程任务的工作日设置(用于统计程任务执行效率) 28.任务监控管理 29.程委办、转办 2.BPMX3多层架构 系统采用多层的系统架构行功能开发,有利于代码功能责任分开,同时有利于不同开发人员的分工及合作,也有利于代码的单元测试。系统总体结构如下图所示: 【图二】BPMX3多层架构 •数据访问层Dao: 负责与数据库交互 •业务处理层Service: 负责系统的所有业务逻辑处理 •数据控制层Controller: 负责系统的页面数据准备及跳转处理 •视图层View :负责数据的展示处理 整合的开源技术 1.Spring Core 3.0.4 2.Spring MVC 3.0 3.Spring Security 3.0.5 4.Spring AOP 3.0.4 5.Apache Active MQ 5.5 6.MyBatis 3 7.CKEditor 3.6 8.JQuery 1.8 9.CXF 2.0 10.Alfresco Activiti 5.8 11.Compass + Lucene 12.JasperReport 4.5 13.JavaMail 14.Other: Log4j,Velocity,Sitemesh,Jfreechart,Jforum,Solr 15.Maven 2 3.BPMX3的组件构建方式 BPMX3同时也是基于组件构构建,整个系统的构建如下所示: 【图三】BPMX3组件构建 系统提供在线程设计器,在线表单设计器,代码生成器,结合BPMX3的基础组件,以实现复杂的程业务应用。基础组件包括: Spring基础组件库,报表引擎,数据库访问模块,短信模块,后台定时任务调用组件,短信访问组件,搜索引擎组件,JMS消息组件,Activiti工作组件,Cas统一用户认证组件,Spring安全认证组件。 4.BPMX3总体功能 1.多系统管理 BPMX3支持多个业务系统同时运行及切换处理,根据不同的用户授权允许用户入不同的系统行访问,而不同的业务系统的开发可以基于BPMX3平台上开发,也可以由其他开发框架开发再与BPMX3做整合。这种模式非常适合企业把BPMX3作为其内部的首先开发平台,以使后续的新应用系统都整合在一起行管理及使用。 【图四】多系统管理 2.用户管理 BPMX3提供多种维度的用户人员管理,以支持各种类型的组织机构及人员的统一管理,目前可以支持内部组织、外部组织 、虚拟组织。而且还提供用户的属性自定义,允许对用户行多种属性的扩展,以支持工作中的任务节点的人员的复杂查找计算。 3.系统安全管理 系统的安全管理由Spring Security 3提供配置及管理,非常容易与第三方的用户或认证平台行整合,如与CAS服务器作统一认证,只需要加上新的配置模块即可实现,不影响系统现有的功能模块。大大满足了各种不同系统的安全管理认证的需要。 同时系统可以支持URL访问权限、数据权限、列权限及页面按钮权限的统一配置管理。系统的安全认证机制如下所示: 【图五】系统安全拦截原理 4.动态表单管理 BPMX3提供了基于数据库内部表、外部表、视图等来生成在线的程表单的功能,其生成是基于模板,模板可由开发人员行自定义,也可以采用BPMX3提供的默认模板。生成的表单后,系统管理员还可以对表单行编辑管理以实现企业的业务要求,其中,还允许开发人员在表单上编写编写脚本,以实现更复杂的应用。 表单上支持系统中的大量组件,如角色选择,用户选择,角色选择,在线表单,套红在线Office表单,签章表单等。系统开发人员几乎不用作任何开发,可以设计出任何复杂的表单应用需求。 表单上支持系统中的大量组件,如角色选择,用户选择,角色选择,在线表单,套红在线Office表单,签章表单等。系统开发人员几乎不用作任何开发,可以设计出任何复杂的表单应用需求。 【图六】在线动态表单 5.程管理 BPMX3提供了基于BPMN2标准的程管理,包括程版本变量,程节点表单设置,表单的权限设置,程任务通知,催办,代办,转化,并行会签、串行会签、补签,子程,同步任务,多实例任务,人工任务、消息任务、邮件任务等,任务多级分发与汇总、任务追回、任务层层驳回,任务自由跳转等中国特色的程需求。能满足企业复杂的程应用需求。 BPMX3在程管理上,不但能结合在线设计的复杂表单,还能结合本系统或其他系统其他模块的功能表单一起行业务审批的工作。这大大方便了业务程在所有的系统中程开发的工作,简化了以往开发程业务的代码固死的做法,把程序员或业务员真正从程业务中解放出来。 【图七】在线程管理 【图八】在线程设计 6.报表管理 系统的报表管理是基于模板来行设置管理的,目前支持FineReport及Jasper Report两种报表引擎,前者是商业报表,其功能非常强大,可以实现多样式数据呈现方式,支持HTML、PDF、EXCEL、Word、TXT、Flash样式呈,能完美解决中国式报表难题,无论数据库内原始数据是以何种样式的表结构存储,无论最终用户要求数据以何种表格样式显示,FineReport报表软件独创的多数据源关联查询、公式动态扩展计算等强大的功能,在无需改变表结构,无需改变用户的要求的基础上,完全按照用户的需求制作出报表模板。 【图九】报表管理 7.系统基础组件 系统的基础组件如用户模块一样,是系统的业务功能的基础,在其他业务模块中被大量使用。 ◦定时任务管理 通过配置以实现某时刻重复执行的系统任务,如配置每月最后一天行库存清算任务,并且启动库存清算审批程。 ◦系统日志管理 记录入系统中的每个用户访问的每个功能 ◦数据源管理 可以设置多种数据源,为在线表单设计及展示提供数据来源 ◦资源管理 管理系统的所有资源,包括URL,业务方法等,提供给安全管理行极限配置 ◦水号管理 用于产生业务的一些处理水单号 ◦数据字典管理 用于管理所有的业务中常用的数据字典的数据 ◦附件管理 管理系统中所有的上传附件。 ◦桌面管理 管理用户的桌面布局及常用的功能展示 ◦邮件、短信模板管理 用于配置系统的发送邮件、短信的模板 ◦工作日历管理 用于配置系统的工作的待办事项的处理工作时间的计算处理 ◦动态脚本管理 用于为程任务节点或事件中可被调用的逻辑计算代码 ◦短信收发管理 基于USB短信猫的短信模块或短信网关,以实现收发手机短信功能。 ◦外部邮件管理 支持POP3,IMap协议的邮件服务收发功能,允许用户设置多个外部邮箱。 ◦内部短消息收发管理 在系统中用户之间可以收发短消息,如工作任务的通知也采用短消息行实时提醒。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值