Flowable中定时器的玩法详解

Flowable中定时器的玩法详解

在Flowable中,定时器是一个非常有用的机制,通过它可以实现一些定时执行的任务,比如定时发送邮件、自动归档数据等等。本文将详细介绍Flowable中定时器的使用方法。

什么是定时器

定时器是在流程执行的某个节点上设置一个定时器,然后在设定的时间点上自动执行某些动作的机制。比如,我们可以设置一个定时器,在一个任务节点上,如果任务没有在设定的时间内被处理,那么就自动触发一些事情(比如将任务的状态改成“超时”)。

定时器的使用方法

在流程定义文件中,使用<timerEventDefinition>标签来定义一个定时器事件。下面是一个示例:

<userTask id="userTask1" name="Demo Task">
  <extensionElements>
    <activiti:taskListener event="create" class="com.example.MyTaskListener" />
  </extensionElements>
  <timerEventDefinition>
      <timeDuration>PT1M</timeDuration>
  </timerEventDefinition>
</userTask>

在上面的代码中,我们在“userTask1”任务节点上定义了一个定时器。该定时器使用元素来指定一个持续时间(PT1M),表示需要等待1分钟后才会触发定时器事件。

另外一个使用方式是使用<timeDate>元素来指定一个确切的日期和时间,如下示例:

<userTask id="userTask2" name="Demo Task">
  <extensionElements>
    <activiti:taskListener event="create" class="com.example.MyTaskListener" />
  </extensionElements>
  <timerEventDefinition>
      <timeDate>2022-01-01T00:00:00</timeDate>
  </timerEventDefinition>
</userTask>

在上面的代码中,我们在“userTask2”任务节点上定义了一个定时器。该定时器使用<timeDate>元素来指定一个确切的日期和时间,表示需要等到2022年1月1日0点0分0秒时才会触发定时器事件。

定时器事件监听器

当定时器事件触发后,我们需要定义一个事件监听器来处理这个事件。例如,我们可以使用<boundaryEvent>来定义事件监听器,如下示例:

<userTask id="userTask3" name="Demo Task">
  <extensionElements>
    <activiti:taskListener event="create" class="com.example.MyTaskListener" />
  </extensionElements>
  <boundaryEvent id="timerBoundaryEvent" attachedToRef="userTask3">
    <timerEventDefinition>
      <timeDuration>PT1M</timeDuration>
    </timerEventDefinition>
  </boundaryEvent>
</userTask>

在上面的代码中,我们为任务“userTask3”定义了一个定时器事件监听器。该监听器使用元素来定义,并绑定到了“userTask3”任务节点上。当任务在1分钟内没有被处理时,将触发定时器事件,并执行我们所定义的监听器逻辑。

使用Java代码启动定时器

除了在流程定义文件中定义定时器外,我们还可以使用Java代码来启动一个定时器。下面是一个示例:

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
ProcessInstance processInstance = processEngine.getRuntimeService().startProcessInstanceByKey("myProcess");
TaskService taskService = processEngine.getTaskService();
TimerJobEntity timerJob = new TimerJobEntity();
timerJob.setJobHandlerType("message");
MessageJobDeclaration messageJobDeclaration = new MessageJobDeclaration("updateTaskList", "myTaskList", "Demo Task", new Date());
timerJob.setJobHandlerConfiguration(messageJobDeclaration.getJobHandlerConfiguration());
processEngine.getManagementService().scheduleTimerJob(timerJob);

在上面的代码中,我们使用ProcessEngine对象来获取运行时服务和任务服务。然后,我们创建一个TimerJobEntity对象,并使用jobHandlerTypejobHandlerConfiguration属性来设置定时器的类型和配置项。最后,我们使用ManagementService的scheduleTimerJob()方法来启动定时器,并将其绑定到当前流程实例上。

示例

下面是一个使用定时器来完成自动签收任务的示例:

<process id="autoClaimTask" name="自动签收任务">
  <startEvent id="startEvent1" />
  <userTask id="userTask1" name="Demo Task">
    <extensionElements>
      <activiti:taskListener event="create" class="org.activiti.examples.MyTaskListener" />
    </extensionElements>
    <extensionElements>
      <activiti:async>false</activiti:async>
    </extensionElements>
    <extensionElements>
      <activiti:taskListener event="assignment" class="org.activiti.examples.AutoClaimTaskListener" />
    </extensionElements>
    <timerEventDefinition>
      <timeDuration>PT1M</timeDuration>
    </timerEventDefinition>
  </userTask>

  <endEvent id="endEvent1" />
  <sequenceFlow id="flow1" sourceRef="startEvent1" targetRef="userTask1" />
  <sequenceFlow id="flow2" sourceRef="userTask1" targetRef="endEvent1" />
</process>

在上面的代码中,我们在“userTask1”任务节点上定义了一个定时器。该定时器使用元素来指定一个持续时间(PT1M),表示需要等待1分钟后才会触发定时器事件。

在Java代码中,我们创建了两个任务分配监听器。其中,第一个监听器MyTaskListener用来在任务创建时进行一些初始化操作,例如对任务的处理时间进行赋值。另外一个监听器AutoClaimTaskListener用于自动签收任务。

public class AutoClaimTaskListener implements TaskListener {

  public void notify(DelegateTask delegateTask) {
    delegateTask.setAssignee("kermit");
  }
}

在上面的代码中,我们通过在任务分配监听器中,将任务自动指派给“kermit”用户,使得任务在超时后会自动被“kermit”签收。

总结

本文介绍了Flowable中定时器的使用方法,并提供了几个示例,希望对读者有所帮助。总的来说,Flowable中定时器是一个非常方便的工具,可以帮助我们简化工作流程中的一些操作,提高工作效率。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Flowable中定时器的玩法详解 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • 一篇文章搞懂Vue3中如何使用ref获取元素节点

    下面是一篇详细讲解“一篇文章搞懂Vue3中如何使用ref获取元素节点”的完整攻略。 什么是ref 在Vue3中,ref是一个用于在模板中给元素或子组件注册引用的函数。通过在模板中使用ref来注册引用,我们可以在Vue实例中访问这些元素或子组件,并进行一些操作。 ref的使用方法如下: <template> <div ref="my…

    Vue 2023年5月27日
    00
  • 关于vue二进制转图片显示问题 后端返回的是byte[]数组

    下面是关于vue二进制转图片显示问题的完整攻略。 问题描述 在开发过程中,有时后端返回的数据可能是一个byte[]数组,而我们需要将其转换为图片进行展示。但是直接将该数组作为图片src的值加载时,浏览器会提示无法识别的图片格式。那么该如何处理这个问题? 解决方案 方案一 使用base64编码将二进制数据转换为base64字符串再进行展示。 // 将byte[…

    Vue 2023年5月29日
    00
  • Vue2中无法监听数组和对象的某些变化问题

    Vue2 中无法监听数组和对象的某些变化是因为,Vue2 采用的是数据劫持的方式来监听数据变化。Vue2 只能监听对象属性的变化及其添加或删除,但是对于对象的属性值改变、数组的变化(包括数组元素的增减及赋值)等操作是无法监听到的。 解决这个问题的方法是使用 Vue 提供的 $set 和 $delete 方法 $set 方法 Vue 中可以通过 $set 方法…

    Vue 2023年5月28日
    00
  • 简单谈一谈Vue中render函数

    当我们通过模板来渲染Vue组件时,Vue框架内部会将其编译成render函数执行。而render函数是Vue中的核心函数,我们可以自己手动编写render函数来实现更加灵活的渲染效果。 一、render函数基础 1.1 什么是render函数 Vue中的render函数是用来创建虚拟DOM的函数。它接受一个“createElement”函数作为参数用来构建D…

    Vue 2023年5月28日
    00
  • vue中组件通信的八种方式(值得收藏!)

    Vue中组件通信的八种方式 在Vue框架中,组件通信是十分重要的一环,特别是在大型项目中。Vue提供了多种方式来实现组件之间的通信。以下是Vue中组件通信的八种方式: 一、父向子传递数据 父组件可以通过prop传递数据给子组件。子组件通过props选项声明自己接受哪些来自父组件的属性。 例如,父组件向子组件传递一个字符串: <!– 父组件 –&gt…

    Vue 2023年5月27日
    00
  • vue基本使用–refs获取组件或元素的实例

    首先,需要了解refs是Vue提供的一个用于获取组件或DOM元素的实例的方法。因为在Vue中,父组件无法直接访问到子组件的实例或子节点的DOM元素,因此refs可以有效地帮助我们访问到这些内容。下面就是refs的使用攻略。 一、创建ref 我们可以通过在DOM元素上添加特殊的ref属性来创建refs。这个属性的值一般是一个字符串,被用来唯一标识该DOM元素或…

    Vue 2023年5月28日
    00
  • Vue六大基本类型中的原始值响应式

    Vue六大基本类型中的原始值响应式是指 Vue 对于 JavaScript 基本数据类型的响应式实现,包括 Number、String、Boolean 和 Symbol 四个类型的数据。 Vue 对于这些数据类型的响应式实现是通过 Object.defineProperty() 方法来实现的。当 Vue 检测到数据发生变化时,会调用数据的 setter 方法…

    Vue 2023年5月28日
    00
  • 一篇超详细的Vue-Router手把手教程

    一篇超详细的Vue-Router手把手教程 简介 Vue-Router是Vue.js官方提供的用于路由管理的插件,可以帮助我们快速地构建单页应用。本文将从基础的使用开始,逐步深入解析Vue-Router的特性和使用方法,让你轻松掌握Vue-Router的使用。 基本使用 安装 使用npm安装Vue-Router: npm install vue-router…

    Vue 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部