Activiti就是这么简单(四)

简介: Activiti5是由Alfresco软件在2010年5月17日发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。Activiti基于Apache许可的开源BPM平台,创始人Tom Baeyens是JBoss jBPM的项目架构师,它特色是提供了eclipse插件,开发人员可以通过插件直接绘画出业务 流程图。.

五、连线


上面我们已将学过了流程变量了,可以在【任务服务、运行时服务、流程开始、完成某个任务时设置流程变量】,而我们的连接就是流程变量的实际应用了….

5.1定义流程图

我们并不是所有的流程都是按一条的路径来走的,我们有的时候会根据条件来走不同的路。当然了,最终该流程是会一步步走完….

例子:

重要的信息交由老板来处理,不重要的信息交由经理来处理

24.jpg这里写图片描述

表达式的结果必须是布尔型

  • #{variable=='value'}
  • ${variable==value}


5.2测试


我在任务完成时设置流程变量为不重要,那么跳到下一个流程时就是经理来进行处理

25.jpg这里写图片描述

当我设置为重要的时候,那么就是交由老板来处理

26.jpg这里写图片描述


六、排他网关


上面我们使用连线的时候用了两个条件   :   要么条件是“重要”,要么条件是“不重要”….如果有另一种情况呢???就是用户把条件输入错了,写成“不知道重不重要”,那么我们的流程怎么走???岂不是奔溃了???

因此,我们要有一条默认的路来走,就是当该变量不符合任何的条件时,我们也有一条默认的路

27.jpg这里写图片描述

值得注意的是:如果是在Eclipse中使用插件的BPMN流程图,如果使用了排他网关,那么在Idea下是解析不了的

解决:

我们只要重新定义BPMN流程图的排他网关就行了,idea中的Activiti插件是不用制定默认流程的,只要我们不设置条件,那就是默认的连接线


6.1测试


public class ExclusiveGetWay {
    private ProcessEngine processEngine = ProcessEngines
            .getDefaultProcessEngine();
    // 部署流程定义,资源来在bpmn格式
    @Test
    public void deployProcessDefi() {
        Deployment deploy = processEngine.getRepositoryService()
                .createDeployment().name("排他网关流程")
                .addClasspathResource("ExclusiveGateway.bpmn")
                .deploy();
        System.out.println("部署名称:" + deploy.getName());
        System.out.println("部署id:" + deploy.getId());
    }
    // 执行流程,开始跑流程
    @Test
    public void startProcess() {
        String processDefiKey = "bankBill";// bpmn 的 process id属性
        ProcessInstance pi = processEngine.getRuntimeService()
                .startProcessInstanceByKey(processDefiKey);
        System.out.println("流程执行对象的id:" + pi.getId());// Execution 对象
        System.out.println("流程实例的id:" + pi.getProcessInstanceId());// ProcessInstance
                                                                    // 对象
        System.out.println("流程定义的id:" + pi.getProcessDefinitionId());// 默认执行的是最新版本的流程定义
    }
    // 查询正在运行任务
    @Test
    public void queryTask() {
        // 取得任务服务
        TaskService taskService = processEngine.getTaskService();
        // 创建一个任务查询对象
        TaskQuery taskQuery = taskService.createTaskQuery();
        // 办理人的任务列表
        List<Task> list = taskQuery.list();
        // 遍历任务列表
        if (list != null && list.size() > 0) {
            for (Task task : list) {
                System.out.println("任务的办理人:" + task.getAssignee());
                System.out.println("任务的id:" + task.getId());
                System.out.println("任务的名称:" + task.getName());
            }
        }
    }
    // 完成任务
    @Test
    public void compileTask() {
        String taskId = "2404";
        Map<String,Object> params=new HashMap<String, Object>();
        params.put("visitor", 6);
        // taskId:任务id
        processEngine.getTaskService().complete(taskId, params);
//        processEngine.getTaskService().complete(taskId);
        System.out.println("当前任务执行完毕");
    }
}

我们指定的值并不是VIP也不是后台,那么就会自动去普通窗口中处理

28.jpgimage.gif这里写图片描述



七、拓展阅读


并行网关:


29.jpg


这里写图片描述

等待活动:


30.jpg这里写图片描述


用户任务:

  • 使用流程变量指定处理人:

我们在快速入门的例子中,是在定义流程图中硬性指定处理人,其实这么干是不够灵活的,我们学了流程变量之后,我们是可以灵活地指定处理人的….

31.jpg这里写图片描述


@Test
    public void deployProcessDefi() {
        Deployment deploy = processEngine.getRepositoryService()
                .createDeployment().name("用户任务指定流程")
                .addClasspathResource("AppayBill.bpmn")
                .deploy();
        System.out.println("部署名称:" + deploy.getName());
        System.out.println("部署id:" + deploy.getId());
    }
    // 执行流程,开始跑流程
    @Test
    public void startProcess() {
        String processDefiKey = "appayBill";// bpmn 的 process id属性
        Map<String,Object> params=new HashMap<String, Object>();
        params.put("userID", "王某某");
        ProcessInstance pi = processEngine.getRuntimeService()
                .startProcessInstanceByKey(processDefiKey, params);
        System.out.println("流程执行对象的id:" + pi.getId());// Execution 对象
        System.out.println("流程实例的id:" + pi.getProcessInstanceId());// ProcessInstance
        // 对象
        System.out.println("流程定义的id:" + pi.getProcessDefinitionId());// 默认执行的是最新版本的流程定义
    }
    // 查询正在运行任务
    @Test
    public void queryTask() {
        String assignee="王某某";//指定任务处理人
        // 取得任务服务
        TaskService taskService = processEngine.getTaskService();
        // 创建一个任务查询对象
        TaskQuery taskQuery = taskService.createTaskQuery();
        // 办理人的任务列表
        List<Task> list = taskQuery
                .taskAssignee(assignee)
                .list();
        // 遍历任务列表
        if (list != null && list.size() > 0) {
            for (Task task : list) {
                System.out.println("任务的办理人:" + task.getAssignee());
                System.out.println("任务的id:" + task.getId());
                System.out.println("任务的名称:" + task.getName());
            }
        }
    }

32.jpg这里写图片描述

使用类指定:

33.jpg


这里写图片描述


组任务:

  • 直接指定办理人

34.jpg这里写图片描述

  • 使用流程变量

35.jpg这里写图片描述

  • 使用类

36.jpg这里写图片描述


总结


  • 如果一个业务需要多方面角色进行处理的话,那么我们最好就是用工作流框架。因为如果其中一个环节的需求发生了变化的话,我们要是没有用到工作流。那就需要修改很多的代码。十分麻烦。
  • Activiti工作流框架快速入门:
  • 定义工作流,使用插件来把我们的流程图画出来。这个流程图就是我们定义的工作流。
  • 工作流引擎是工作流的核心,能够让我们定义出来的工作流部署起来。
  • 由于我们使用工作流的时候是有很多数据产生的,因此Activiti是将数据保存到数据库表中的。这些数据库表由Actitviti创建,由Activiti维护。
  • 部署完的工作流是需要手动去执行该工作流的。
  • 根据由谁处理当前任务,我们就可以查询出具体的任务信息。
  • 根据任务的id,我们就可以执行任务了。
  • 流程定义涉及到了四张数据库表
  • 我们可以通过API把我们的流程定义图读取出来
  • 可以根据查询最新版本的流程定义
  • 删除流程定义
  • 部署流程定义的时候也可以是ZIP文件
  • 流程在运行中,涉及到两个对象,四张数据库表:
  • 获取流程实例和任务的历史信息
  • 判断流程实例是否为空来判断流程是否结束了
  • 查看正在运行服务的详细信息
  • 通过流程实例来开启流程
  • 如果流程没有分支的话,那么流程实例就等于流程对象
  • 流程实例
  • 流程任务
  • 流程实例可以有多个,流程对象只能有一个。
  • 基于这么两个对象,我们就可以做很多事情了
  • 流程变量:它涉及到了两张表。流程变量实际上就是我们的条件。
  • 流程变量的作用域只在流程实例中。
  • 我们可以在流程开始的时候设置流程变量,在任务完成的时候设置流程变量。
  • 运行时服务和流程任务都可以设置流程变量。
  • 通过连线我们可以在其中设置条件,根据不同的条件流程走不同的分支
  • 如果没有设置默认的条件,当条件不吻合的时候,那么流程就走不下去了,因此需要排他网关来设置一条默认的路径。
目录
相关文章
|
7月前
|
XML 数据可视化 安全
一文了解Activiti7
一文了解Activiti7
154 0
|
数据可视化 Java 关系型数据库
01-认识Activiti
类似如请假、离职、出差、报销这种有审批流程的业务,我们都可以称之为工作流(也叫流程引擎),它可以帮助用户实现一个审批流程的可视化,借助于工作流引擎可以搭建客户关系管理系统(CRM)、运输管理系统(TMS)、仓储管理系统(WMS)、财务费用系统等多种复杂业务系统。
114 0
|
7月前
|
XML Java API
Activiti应用
Activiti应用
99 0
|
安全 Java 测试技术
Activiti-Activiti整合篇
Activiti-Activiti整合篇
Activiti-Activiti整合篇
|
架构师 Java 应用服务中间件
Activiti就是这么简单(一)
Activiti5是由Alfresco软件在2010年5月17日发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。Activiti基于Apache许可的开源BPM平台,创始人Tom Baeyens是JBoss jBPM的项目架构师,它特色是提供了eclipse插件,开发人员可以通过插件直接绘画出业务 流程图。.
398 0
Activiti就是这么简单(一)
|
架构师 应用服务中间件 Apache
Activiti就是这么简单(三)
Activiti5是由Alfresco软件在2010年5月17日发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。Activiti基于Apache许可的开源BPM平台,创始人Tom Baeyens是JBoss jBPM的项目架构师,它特色是提供了eclipse插件,开发人员可以通过插件直接绘画出业务 流程图。.
291 0
Activiti就是这么简单(三)
|
架构师 应用服务中间件 Apache
Activiti就是这么简单(二)
Activiti5是由Alfresco软件在2010年5月17日发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。Activiti基于Apache许可的开源BPM平台,创始人Tom Baeyens是JBoss jBPM的项目架构师,它特色是提供了eclipse插件,开发人员可以通过插件直接绘画出业务 流程图。.
216 0
Activiti就是这么简单(二)
|
XML 数据格式
Activiti 6.x【10】BoundaryEvent【下】
版权声明:转载注明出处就OK的说,有些东西会转载,都会注明的说= =如果有冒犯麻烦见谅 https://blog.csdn.net/Pan1458689676/article/details/82720556 ...
2521 0
|
XML 数据格式
Activiti 6.x【11】IntermediateEvent
版权声明:转载注明出处就OK的说,有些东西会转载,都会注明的说= =如果有冒犯麻烦见谅 https://blog.csdn.net/Pan1458689676/article/details/82728835 ...
1758 0
|
XML 数据格式
Activiti 6.x【8】EndEvent
版权声明:转载注明出处就OK的说,有些东西会转载,都会注明的说= =如果有冒犯麻烦见谅 https://blog.csdn.net/Pan1458689676/article/details/82711607 ...
1603 0