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日

相关文章

  • Vue动态实现评分效果

    下面就是 “Vue动态实现评分效果” 的完整攻略。 1. 了解评分组件的实现细节 评分组件是一个很常见的组件,在 Vue 中实现起来也比较简单。我们可以通过 v-for 指令渲染出固定个数的星星图标,然后通过绑定 @click 事件来处理星星的选中状态,进而实现评分效果。具体实现步骤如下: 首先,我们需要定义一个数组 starList 来存储星星的显示状态,…

    Vue 2023年5月27日
    00
  • vue使用计算属性完成动态滑竿条制作

    下面我将详细讲解“Vue使用计算属性完成动态滑竿条制作”的完整攻略,包括具体的步骤和示例说明。 步骤 1. 创建Vue实例 首先,我们需要创建一个Vue实例,可以使用以下代码: new Vue({ el: ‘#app’, data: { value: 50 } }); 这里el用来指定Vue实例将会挂载的元素,data则用来定义Vue实例中的数据,这里我们定…

    Vue 2023年5月29日
    00
  • vue项目总结之文件夹结构配置详解

    当我们开发 Vue 项目时,良好的文件夹结构对于提高代码的可读性和可维护性至关重要。下面我将详细讲解“vue项目总结之文件夹结构配置详解”的完整攻略,帮助大家合理配置 Vue 项目的文件夹结构。 1. 将所有组件放在 components 目录下 在开发 Vue 项目时,通常会有很多的组件。为了使项目结构更为清晰,建议将所有组件放在 components 目…

    Vue 2023年5月28日
    00
  • 谈谈对Vue Router的理解

    当我们构建单页应用程序(SPA)时,我们通常需要跟不同URL之间进行交互。这通常是通过前端路由来实现的,可以为不同的URL路径定义不同的视图层,使用户可以无感知地在不同的视图层之间进行切换。 Vue Router是一个官方的Vue.js路由管理器,它通过将组件映射到不同的路由来负责为应用程序提供前端路由,并且非常适合用于构建单页应用程序。接下来让我们来讨论一…

    Vue 2023年5月28日
    00
  • 在Vant的基础上封装下拉日期控件的代码示例

    下面我就为你详细讲解一下“在Vant的基础上封装下拉日期控件的代码示例”的完整攻略。 1. 准备工作 在封装下拉日期控件之前,需要先准备好项目的开发环境以及需要使用的工具和框架。下面是具体步骤: 使用vue-cli创建一个vue项目,可以在终端中执行如下命令: vue create my-project 安装Vant UI框架,可以在终端中执行如下命令: n…

    Vue 2023年5月29日
    00
  • Element-UI中回显失败问题的完美解决

    当我们在使用 Element-UI 中的级联选择器(Cascader)组件时,有时会遇到回显失败的问题,导致选择的值无法正确显示在界面上。这个问题的解决方式有多种,下面我们来详细介绍一种完美解决方案。 问题现象 在使用 Element-UI 的级联选择器组件时,有时候我们需要在修改页面中回显已经选择过的值。这时候,我们可以使用v-model绑定父子组件的选中…

    Vue 2023年5月28日
    00
  • vue2.0 与 bootstrap datetimepicker的结合使用实例

    下面我将详细讲解“vue2.0 与 bootstrap datetimepicker的结合使用实例”的完整攻略。 什么是bootstrap datetimepicker? bootstrap datetimepicker是基于Bootstrap样式的日期和时间选择插件。它可以方便地自定义日期和时间格式,支持语言环境等功能,非常适合用于日期和时间的选择和显示。…

    Vue 2023年5月29日
    00
  • gojs实现蚂蚁线动画效果

    为了实现蚂蚁线动画效果,可以使用gojs库中的动画和数据模型功能。下面是实现该效果的完整攻略: 创建GoJS图表数据模型 蚂蚁线动画效果需要使用GoJS的Layout模块。在Layout模块的输入上,需要创建一个数据模型,以描述要排列的节点及它们之间的连接关系。数据模型可以由JSON对象创建,包含节点和联系人数组。示例: var data = { nodeD…

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