(4)Flowable任务分配-固定分配、表达式分配、监听器分配

1、固定分配

在绘制流程图或者直接在流程文件中通过Assignee来指定的方式。直接是写死的。

在这里插入图片描述

2、表达式分配

Flowable使用UEL进行表达式解析。UEL代表Unified Expression Language,是EE6规范的一部分(查看EE6规范了解更多信息)。

表达式可以用于Java服务任务(Java Service task)执行监听器(Execution Listener)任务监听器(Task Listener)条件顺序流(Conditional sequence flow)等。尽管有值表达式与方法表达式这两种不同的表达式,Flowable通过抽象,使它们都可以在需要表达式的地方使用。

  • 值表达式 Value expression: 解析为一个值。默认情况下,所有流程变量都可以使用。(若使用Spring)所有的Spring bean也可以用在表达式里。例如:
${myVar}
${myBean.myProperty}

myBean是Spring容器中的个Bean对象,表示调用的是bean的addNewOrder方法

首先新建一个值表达式的例子

可视编辑器–>分配用户–>固定值—>${assignee1}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在次流程部署了之后,在流程定义信息表中可以看到此流程的相关信息

在这里插入图片描述

    /**
     * 启动流程实例
     */
    @Test
    public void TestDeploymentRun() {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        RuntimeService runtimeService = processEngine.getRuntimeService();
        // 流程变量
        Map<String, Object> variables = new HashMap<String, Object>();
        variables.put("assignee0", "张三");
        variables.put("assignee1", "李四");
        // 启动流程实例
        // ProcessInstance processInstance = runtimeService.startProcessInstanceById("holidayRequest:1:37504", variables);
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("MyHolidayUI001", variables);

        System.out.println("processInstance.getProcessDefinitionId() = " + processInstance.getProcessDefinitionId()); // MyHolidayUI001:1:37504
        System.out.println("processInstance.getProcessDefinitionKey() = " + processInstance.getProcessDefinitionKey());// MyHolidayUI001
        System.out.println("processInstance.getActivityId() = " + processInstance.getActivityId());
        System.out.println("processInstance.getId()" + processInstance.getId());// 40001
    }

可以看到我们设置的变量

在这里插入图片描述

在task表中,可以看到当前分配人是张三,说明值表达式被解析了

在这里插入图片描述

    /**
     * 完成任务
     */
    @Test
    public void TestCompleteTask() {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        Task task = taskService.createTaskQuery()
                .processInstanceId("40001") //根据流程实例编号查找
                .taskAssignee("张三")
                .singleResult();

        taskService.complete(task.getId());
    }

在张三完成任务之后,task表中的分配人变成了李四

在这里插入图片描述

  • 方法表达式 Method expression: 调用一个方法,可以带或不带参数。**当调用不带参数的方法时,要确保在方法名后添加空括号(以避免与值表达式混淆)。**传递的参数可以是字面值(literal value),也可以是表达式,它们会被自动解析。例如:
${printer.print()}
${myBean.addNewOrder('orderName')}
${myBean.doSomething(myVar, execution)}

请注意,表达式支持解析(及比较)原始类型(primitive)、bean、list、array与map。

3、监听器分配

任务监听器(Task Listener)

我们在此处使用监听器来完成负责人的指定,那么我们在流程设计的时候就不需要指定assignee。但是需要指定任务监听器。

创建自定义监听器:

public class MyTaskListener implements TaskListener {
    public void notify(DelegateTask delegateTask) {
        System.out.println("监听器被触发了:" + delegateTask.getName() + "==" + delegateTask.getEventName());
        if("提交请假流程".equals(delegateTask.getName()) &&
            "create".equals(delegateTask.getEventName())){
            // 指定任务的负责人
            delegateTask.setAssignee("小明");
        } else {
            delegateTask.setAssignee("小张");
        }
    }
}

之后,在流程设计的时候,指定任务监听器。这里两个节点指定同一个监听器,意味着会触发两次,当然,你也可以为他们指定不同的监听器。

在这里插入图片描述

在这里插入图片描述

部署流程之后,

在这里插入图片描述

    /**
     * 启动流程实例
     */
    @Test
    public void TestDeploymentRun() {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        RuntimeService runtimeService = processEngine.getRuntimeService();
        // 启动流程实例
        // ProcessInstance processInstance = runtimeService.startProcessInstanceById("holidayRequest:1:37504", variables);
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("MyHolidayUI001NoAssignee");

        System.out.println("processInstance.getProcessDefinitionId() = " + processInstance.getProcessDefinitionId()); 
        System.out.println("processInstance.getProcessDefinitionKey() = " + processInstance.getProcessDefinitionKey());
        System.out.println("processInstance.getActivityId() = " + processInstance.getActivityId());
        System.out.println("processInstance.getId()" + processInstance.getId());
    }

启动流程,在日志中打印了如下信息,说明监听器被触发了,分配人呗设置成了小明。

监听器被触发了:提交请假流程==create

在这里插入图片描述

在这里插入图片描述

    /**
     * 完成任务
     */
    @Test
    public void TestCompleteTask() {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        Task task = taskService.createTaskQuery()
                .processInstanceId("52501") //根据流程实例编号查找
                .taskAssignee("小明")
                .singleResult();

        taskService.complete(task.getId());
    }

小明去完成任务,在日志中打印了如下信息,说明监听器被触发了,分配人呗设置成了小张。

监听器被触发了:总经理审批==create

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本课程是《Flowable流程入门课程》的后续高级课程。在学习本课程前,应先学习入门课程,以掌握相关基础知识。高级课程着重讲解Flowable工作流的高级概念、复杂理论和实战应用。课程内容包括流程管理思想、技术与标准、工作流的控制模式和资源模式;Flowable数据库表及变量;与Spring、Spring Boot的集成;BPMN 2.0主要图;Flowable高级服务如JAVA服务任务、脚本任务、Web Service任务、外部工作者任务、多实例任务、补偿处理程序、子流程和调用活动等;Flowable事件侦听器、执行侦听器和任务侦听器;Flowable历史和REST API;Flowable事务、并发性、身份管理及LDAP集成;Flowable高级主题如流程实例迁移、异步执行器的设计与配置、用于高并发的UUID ID生成器、多租户、高级流程引擎配置、执行自定义SQL和实验性流程调试器等;Flowable Eclipse设计器特性及定制;Flowable 事件注册;Flowable相关标准和规范如ISO8601标准和cron等。本课程对Flowable官方文档进行了彻底梳理和融汇贯通,并结合实践,形象生动、系统全面、简单易懂地呈现给大家,让大家从开源软件文档冗长耗时、英文晦涩难懂、概念理解困难、知识点分散等困境中解脱出来,从而能快速地将Flowable具有的高级特性应用到项目的高级需求和复杂实践中去。课程特色:案例和代码驱动、基础概念与经典实战相结合、知识环节融会贯通、关联知识平滑拓展、概念和原理展示形象生动。
Flowable动态任务分配是指根据不同的业务规则或条件,在运行时动态地分配任务给不同的用户或角色。通过集成Flowable,我们可以与系统的用户角色进行绑定,并非常方便地设置任务的办理人与办理角色。这样可以根据具体的需求,灵活地决定任务的分配方式。 在使用Flowable进行动态任务分配时,可以使用以下方法: 1. 完成流程实例:通过任务服务(TaskService)的complete方法,可以完成当前任务,并自动触发下一个任务的创建与分配。可以根据具体的业务逻辑来决定任务的完成条件和下一个任务的办理人或角色。 2. 部署流程:使用Flowable的流程引擎(ProcessEngine)提供的部署方法,可以将定义好的流程模型部署到Flowable引擎中,以便后续启动流程实例。 3. 启动流程:通过运行时服务(RuntimeService)的startProcessInstanceByKey方法,可以启动一个流程实例,并指定流程定义的关键字。在启动流程时,可以设置发起人的身份信息,以便在后续任务分配中进行参考。 4. 查询任务:通过任务服务的createTaskQuery方法可以查询符合条件的任务列表,可以根据流程定义的关键字、任务名称等条件进行过滤。查询到的任务列表中包含任务的ID、名称、办理人等信息,可以用于后续的任务处理。 使用Flowable的动态任务分配功能,可以根据具体的业务需求,灵活地设置任务的办理人与办理角色。这样可以提高任务分配的灵活性和效率,使流程执行更加符合实际情况。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [开源OA协同办公系统,集成Flowable流程引擎 可拖拽创建个性表单](https://download.csdn.net/download/weixin_36643308/88202749)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Flowable进阶学习(四)任务分配与流程变量](https://blog.csdn.net/qq_40366738/article/details/128746821)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值