`

Activiti定时任务示例

阅读更多
工作流其实做的事情还是很多的,
这不,这周公司经理叫我在前段时间的基础上,把项目中的一个客户回访计划的提醒功能也加到工作流当中,对于没有接触过定时任务的我来说,又有的一番研究了。
在 咖啡兔 http://weibo.com/kafeituzi 的提醒下,使用了边界定时事件 + Job的方式成功实现了,任务定时启动,任务超时过期处理的功能,必须得感谢兔子,感谢他对Activiti在国内的普及所作出的努力。也希望Activiti的路越走越远,现在5.11版本还是和以前老版本有了很多的变化了,好用,简单实用的API,有了native query,也方便自己扩展。
好了,废话不多说,开始分析实例:
1.开启JOB引擎,在activiti配置文件中:
<property name="jobExecutorActivate" value="true" />

这个必须开启,如果没有开启的话,定时任务是启动不了的。呵呵,
其实这个功能开启过后,在后台的实现是这样饿,它会定时的查询act_ru_job这一张表,看见我们的某一条记录的时间要求达到了,就会执行这一个JOB。是不是就明白了?如果是web项目,你打开LOG功能,在控制台是可以看见日志输出的,其实就是这个JOB引擎在工作。
2.下面就是流程图设计。

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
  <process id="notify" name="任务计划" isExecutable="true">
    <userTask id="usertask1" name="任务等待"></userTask>
    <endEvent id="endevent1" name="End"></endEvent>
    <startEvent id="startevent1" name="Start"></startEvent>
    <sequenceFlow id="flow5" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
    <boundaryEvent id="boundarytimer1" name="Timer" attachedToRef="usertask1" cancelActivity="true">
      <timerEventDefinition>
        <timeDate>${qishi}</timeDate>
      </timerEventDefinition>
    </boundaryEvent>
    <userTask id="usertask2" name="任务提醒" activiti:candidateUsers="123">
      <extensionElements>
        <activiti:taskListener event="create" delegateExpression="${notifyHandler}"></activiti:taskListener>
      </extensionElements>
    </userTask>
    <sequenceFlow id="flow6" sourceRef="boundarytimer1" targetRef="usertask2"></sequenceFlow>
    <serviceTask id="servicetask3" name="任务处理" activiti:expression="${myHandler}"></serviceTask>
    <sequenceFlow id="flow7" sourceRef="usertask2" targetRef="servicetask3"></sequenceFlow>
    <sequenceFlow id="flow8" sourceRef="servicetask3" targetRef="endevent1"></sequenceFlow>
    <boundaryEvent id="boundarytimer2" name="Timer" attachedToRef="usertask2" cancelActivity="true">
      <timerEventDefinition>
        <timeDate>${jieshu}</timeDate>
      </timerEventDefinition>
    </boundaryEvent>
    <serviceTask id="servicetask4" name="任务过期" activiti:delegateExpression="${myHandler2}"></serviceTask>
    <sequenceFlow id="flow9" sourceRef="boundarytimer2" targetRef="servicetask4"></sequenceFlow>
    <sequenceFlow id="flow10" sourceRef="servicetask4" targetRef="endevent1"></sequenceFlow>
  </process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_notify">
    <bpmndi:BPMNPlane bpmnElement="notify" id="BPMNPlane_notify">
      <bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1">
        <omgdc:Bounds height="55.0" width="105.0" x="180.0" y="110.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="boundarytimer1" id="BPMNShape_boundarytimer1">
        <omgdc:Bounds height="30.0" width="30.0" x="271.0" y="124.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
        <omgdc:Bounds height="35.0" width="35.0" x="670.0" y="120.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
        <omgdc:Bounds height="35.0" width="35.0" x="70.0" y="120.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="usertask2" id="BPMNShape_usertask2">
        <omgdc:Bounds height="55.0" width="105.0" x="330.0" y="110.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="servicetask3" id="BPMNShape_servicetask3">
        <omgdc:Bounds height="55.0" width="105.0" x="500.0" y="110.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="boundarytimer2" id="BPMNShape_boundarytimer2">
        <omgdc:Bounds height="30.0" width="30.0" x="405.0" y="150.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="servicetask4" id="BPMNShape_servicetask4">
        <omgdc:Bounds height="55.0" width="105.0" x="500.0" y="210.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge bpmnElement="flow5" id="BPMNEdge_flow5">
        <omgdi:waypoint x="105.0" y="137.0"></omgdi:waypoint>
        <omgdi:waypoint x="180.0" y="137.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="flow6" id="BPMNEdge_flow6">
        <omgdi:waypoint x="301.0" y="139.0"></omgdi:waypoint>
        <omgdi:waypoint x="330.0" y="137.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="flow7" id="BPMNEdge_flow7">
        <omgdi:waypoint x="435.0" y="137.0"></omgdi:waypoint>
        <omgdi:waypoint x="500.0" y="137.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="flow8" id="BPMNEdge_flow8">
        <omgdi:waypoint x="605.0" y="137.0"></omgdi:waypoint>
        <omgdi:waypoint x="670.0" y="137.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="flow9" id="BPMNEdge_flow9">
        <omgdi:waypoint x="420.0" y="180.0"></omgdi:waypoint>
        <omgdi:waypoint x="419.0" y="237.0"></omgdi:waypoint>
        <omgdi:waypoint x="500.0" y="237.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="flow10" id="BPMNEdge_flow10">
        <omgdi:waypoint x="605.0" y="237.0"></omgdi:waypoint>
        <omgdi:waypoint x="687.0" y="237.0"></omgdi:waypoint>
        <omgdi:waypoint x="687.0" y="155.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</definitions>

流程定义大致就这这个样子的,其中的两个定时时间的时间都是用的变量,
我是在启动流程的时候保存到流程变量里面的,然后引擎会自己到变量里面取值赋给它,
这个地方要注意,时间要ISO8601格式的, 类似 : 2013-01-25T12:12:12

如有不明白之处大家可以共同讨论。
如果你有更好的方案,也可以提出来,大家共同探讨。
分享到:
评论
10 楼 mazhi4562qq 2016-08-12  
你好, 可以请教个关于activiti定时边界事件的问题么?我的qq和微信都是这个:278205092,谢谢啊。
9 楼 wscxyok 2015-11-02  
hi , 楼主,我遇到过类似的问题,我用的是timeDuration,我想实现的是让任务延迟10秒:
<intermediateCatchEvent id="sid-140BA4B7-61AC-419C-BBBF-F046F41E3D2E">
      <timerEventDefinition>
        <timeDuration>PT10S</timeDuration>
      </timerEventDefinition>
    </intermediateCatchEvent>
但10 秒之后,任务没有被认领,并且我也配置了 :<property name="jobExecutorActivate" value="true" />,他的意思是让job 自动执行。奇怪的是只有当我重启服务器的时候,这个任务才会被认领(执行这个job),困扰几天了,求解答。
8 楼 programerje 2015-05-19  
你敢不敢把源码贴出来!
7 楼 星河630 2013-05-31  
[/img][/img]
6 楼 yangfq 2013-05-25  
楼主您好,能否给个demo可以参考下怎么使用呢,刚接触activiti,还望多多指教!谢谢
5 楼 旋风小皮皮 2013-03-14  
你好,我按照你的例子做了一个流程,用junit跑用例的时候报了一个错:
Timeout trying to lock table "ACT_RU_JOB",请问是什么原因?
4 楼 wslovenide 2013-02-20  
org.activiti.engine.ActivitiOptimisticLockingException: TimerEntity[57812] was updated by another transaction concurrently

3 楼 lucky16 2013-02-20  
wslovenide 写道
监听器里面是delegateTask.getExecution().setVariable("dueTime", "PT60S"); 也不行

你能把你的错误关键代码贴出来一下吗?
2 楼 wslovenide 2013-02-20  
监听器里面是delegateTask.getExecution().setVariable("dueTime", "PT60S"); 也不行
1 楼 wslovenide 2013-02-20  
我遇到个问题,流程跟你这个类似,定时时间也是用的变量,但是变量不是在流程启动的时候就加上去的,在用户任务里面加了一个任务监听器,在这个任务监听器里面我从数据库中查询出定时时间,把这个时间设置到流程变量里面,但是总是报错。。。不知为何,若是启动流程的时候就把变量加上就不会出错.
<startEvent id="startevent1" name="Start"></startEvent>
    <userTask id="usertask1" name="User Task-fozzie" activiti:assignee="fozzie">
        <extensionElements>
            <activiti:taskListener event="create" class="com.activiti.testcase.timer.TaskListener1"></activiti:taskListener>
        </extensionElements>
    </userTask>
    <boundaryEvent id="boundarytimer1" cancelActivity="false" attachedToRef="usertask1">
      <timerEventDefinition>
          <timeDuration>${dueTime}</timeDuration>
      </timerEventDefinition>
    </boundaryEvent>

public class TaskListener1 implements TaskListener {

	public void notify(DelegateTask delegateTask) {
		delegateTask.getExecution().setVariable("dueTime22", "PT60S");
	}
}



相关推荐

    jeecgboot +activiti5.22集成

    JeecgBoot基于Spring Boot框架,遵循“代码即配置”的理念,提供了开箱即用的服务,包括数据源管理、定时任务、日志管理等。其内置的代码生成器可以自动生成前后端代码,大大减少了编码时间。此外,JeecgBoot还集成...

    jeecg-boot集成activiti demo.rar

    - **自定义Activiti行为**:根据业务需求,可以编写自定义的Activiti行为,如定时任务、监听器等。 - **集成其他框架**:Jeecg-Boot可以与其他框架如MyBatis Plus、Spring Security等配合,增强系统的功能和安全性...

    bpmn适配activiti.rar

    9. 定时器和持久化:了解Activiti如何处理定时任务,以及它如何将流程实例和相关数据存储在数据库中。 10. 服务任务和集成:学习如何使用服务任务调用外部系统,实现BPMN与企业应用系统的集成。 通过学习以上知识...

    activiti基本操作

    Activiti 提供了丰富的API和插件机制,可以定制工作流行为,如定时任务、信号、事件订阅等。 这个"activiti基本操作"的学习资源将帮助初学者快速理解并掌握Activiti的基本用法,通过示例和核心配置文件,可以加深...

    Spring cloud和流程引擎activiti5整合代码二,事件网关,定时事件和信号事件

    在本项目中,我们将深入探讨如何将Spring Cloud与流程引擎Activiti5进行集成,并重点关注事件网关、定时事件和信号事件的使用。Spring Cloud提供了一种微服务架构下的服务发现、配置管理和负载均衡等功能,而...

    Spring-activiti代码

    这通常需要一个流程启动的触发条件,例如一个HTTP请求或定时任务。 6. **任务处理**:Activiti中的任务是分配给特定用户或组的。`TaskService`提供接口来查询当前任务、分配任务和完成任务。在Spring中,可以使用`@...

    工作流activiti简单demo

    这个"工作流activiti简单demo"是为初学者或开发者提供的一种快速入门示例,旨在帮助理解Activiti的核心概念和操作。 1. Activiti简介: Activiti 是由 Alfresco 公司开发的一个基于 Java 的 BPMN 2.0 规范的工作流...

    activiti6.0工作流配置(中文)

    2. 任务分配与处理:利用Task Service获取当前用户的任务列表,实现任务的领取和完成,理解委托、定时任务等高级功能。 3. 信号与事件:了解如何在流程中使用信号和事件,以实现异步通信和流程间的交互。 4. 表单...

    Activiti入门—环境搭建和核心API简介

    Activiti 是一个开源的...在实际应用中,还可以结合Activiti的定时器服务ManagerService来设置定时任务,进一步提升流程的自动化程度。总之,深入掌握这些API,是利用Activiti实现高效、可扩展的企业业务流程的关键。

    Activiti 5.8 用户指南

    - 介绍如何激活作业执行器,以确保 Activiti 能够按时执行定时任务。 ##### 3.5 邮件服务器配置 - 指导如何配置邮件服务器,以便 Activiti 在执行某些操作时能够发送通知邮件。 ##### 3.6 历史记录配置 - 说明如何...

    Activiti6 中文 用户指南 操作手册 开发API

    - **Job Executor**:用于执行定时任务,从6.0.0版本开始引入。 - **事件处理程序**:可以监听并响应流程中的特定事件,如流程开始、结束等。 4. **Activiti API** - **Process Engine API和服务**:提供与流程...

    activiti文档

    - **定时器事件定义**:设置定时触发的事件。 - **错误事件定义**:定义错误事件。 - **信号事件定义**:定义信号事件。 - **消息事件定义**:定义消息事件。 - **开始事件**:不同类型的开始事件。 - **结束事件**...

    activiti-5.18.0

    在5.18.0版本中, Activiti 引入了对事件处理的增强,使得系统能够更好地响应外部事件,如定时事件、信号事件或消息事件。这增强了流程的灵活性,让系统能够根据外部条件自动触发流程的下一步。 另外,Activiti 还...

    activiti-demo6-springboot-master.zip

    它集成了大量的常用组件,如数据源、定时任务、缓存等,开发者可以“零配置”地快速创建一个独立运行的应用。 2. **Activiti介绍** Activiti是一个开源的工作流引擎,支持BPMN 2.0标准,提供了图形化的流程设计...

    Activiti6 中文 用户指南.docx

    - **Job Executor**:从6.0.0版本开始,Job Executor负责执行定时任务和补偿任务,例如,处理异步行为。 - **邮件服务器配置**:配置邮件服务器信息,以便Activiti能发送通知邮件。 4. **API**: - **Process ...

    activiti-sample

    7. 触发器和定时器:了解如何设置定时任务,以及如何通过信号或消息触发流程的下一步。 8. 审批逻辑:学习如何实现复杂的审批规则,如并行审批、条件分支等。 9. 流程监听器和事件:利用监听器和事件机制来监控流程...

    activiti学习-demo

    5. **服务任务与API**:Activiti 提供了丰富的服务任务,如调用外部服务、定时任务等。开发者可以通过API与这些任务交互,实现流程中的业务逻辑。 6. **表达式与脚本**:Activiti 支持使用EL(Expression Language...

    activiti 5.16 流程管理 中文版

    - **启用Job执行器**:配置定时任务处理器。 - **配置邮件服务器**:发送邮件通知等功能。 - **配置历史**:记录流程实例的历史数据。 - **为表达式和脚本暴露配置**:允许在流程定义中使用表达式和脚本。 - **配置...

    activiti表结构说明.docx

    - **简要描述**:存储运行时定时任务数据。 ##### 21. 运行时任务节点表 (act_ru_task) - **简要描述**:存储运行时任务数据。 ##### 22. 运行时流程变量数据表 (act_ru_variable) - **简要描述**:存储运行时...

    集成Activiti工作流的J2EE快速开发框架

    系统监控:系统日志、接口api、系统监控、可配置定时任务 前端可配置化定时任务。 采用swagger可视化出实时方法格式以及数据属性,采用阿里druid 工作流程管理:完全实现模块化,无侵入。 流程管理:动态给发布流程...

Global site tag (gtag.js) - Google Analytics