工作流其实做的事情还是很多的,
这不,这周公司经理叫我在前段时间的基础上,把项目中的一个客户回访计划的提醒功能也加到工作流当中,对于没有接触过定时任务的我来说,又有的一番研究了。
在 咖啡兔
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
如有不明白之处大家可以共同讨论。
如果你有更好的方案,也可以提出来,大家共同探讨。
分享到:
相关推荐
JeecgBoot基于Spring Boot框架,遵循“代码即配置”的理念,提供了开箱即用的服务,包括数据源管理、定时任务、日志管理等。其内置的代码生成器可以自动生成前后端代码,大大减少了编码时间。此外,JeecgBoot还集成...
- **自定义Activiti行为**:根据业务需求,可以编写自定义的Activiti行为,如定时任务、监听器等。 - **集成其他框架**:Jeecg-Boot可以与其他框架如MyBatis Plus、Spring Security等配合,增强系统的功能和安全性...
9. 定时器和持久化:了解Activiti如何处理定时任务,以及它如何将流程实例和相关数据存储在数据库中。 10. 服务任务和集成:学习如何使用服务任务调用外部系统,实现BPMN与企业应用系统的集成。 通过学习以上知识...
Activiti 提供了丰富的API和插件机制,可以定制工作流行为,如定时任务、信号、事件订阅等。 这个"activiti基本操作"的学习资源将帮助初学者快速理解并掌握Activiti的基本用法,通过示例和核心配置文件,可以加深...
在本项目中,我们将深入探讨如何将Spring Cloud与流程引擎Activiti5进行集成,并重点关注事件网关、定时事件和信号事件的使用。Spring Cloud提供了一种微服务架构下的服务发现、配置管理和负载均衡等功能,而...
这通常需要一个流程启动的触发条件,例如一个HTTP请求或定时任务。 6. **任务处理**:Activiti中的任务是分配给特定用户或组的。`TaskService`提供接口来查询当前任务、分配任务和完成任务。在Spring中,可以使用`@...
这个"工作流activiti简单demo"是为初学者或开发者提供的一种快速入门示例,旨在帮助理解Activiti的核心概念和操作。 1. Activiti简介: Activiti 是由 Alfresco 公司开发的一个基于 Java 的 BPMN 2.0 规范的工作流...
2. 任务分配与处理:利用Task Service获取当前用户的任务列表,实现任务的领取和完成,理解委托、定时任务等高级功能。 3. 信号与事件:了解如何在流程中使用信号和事件,以实现异步通信和流程间的交互。 4. 表单...
Activiti 是一个开源的...在实际应用中,还可以结合Activiti的定时器服务ManagerService来设置定时任务,进一步提升流程的自动化程度。总之,深入掌握这些API,是利用Activiti实现高效、可扩展的企业业务流程的关键。
- 介绍如何激活作业执行器,以确保 Activiti 能够按时执行定时任务。 ##### 3.5 邮件服务器配置 - 指导如何配置邮件服务器,以便 Activiti 在执行某些操作时能够发送通知邮件。 ##### 3.6 历史记录配置 - 说明如何...
- **Job Executor**:用于执行定时任务,从6.0.0版本开始引入。 - **事件处理程序**:可以监听并响应流程中的特定事件,如流程开始、结束等。 4. **Activiti API** - **Process Engine API和服务**:提供与流程...
- **定时器事件定义**:设置定时触发的事件。 - **错误事件定义**:定义错误事件。 - **信号事件定义**:定义信号事件。 - **消息事件定义**:定义消息事件。 - **开始事件**:不同类型的开始事件。 - **结束事件**...
在5.18.0版本中, Activiti 引入了对事件处理的增强,使得系统能够更好地响应外部事件,如定时事件、信号事件或消息事件。这增强了流程的灵活性,让系统能够根据外部条件自动触发流程的下一步。 另外,Activiti 还...
它集成了大量的常用组件,如数据源、定时任务、缓存等,开发者可以“零配置”地快速创建一个独立运行的应用。 2. **Activiti介绍** Activiti是一个开源的工作流引擎,支持BPMN 2.0标准,提供了图形化的流程设计...
- **Job Executor**:从6.0.0版本开始,Job Executor负责执行定时任务和补偿任务,例如,处理异步行为。 - **邮件服务器配置**:配置邮件服务器信息,以便Activiti能发送通知邮件。 4. **API**: - **Process ...
7. 触发器和定时器:了解如何设置定时任务,以及如何通过信号或消息触发流程的下一步。 8. 审批逻辑:学习如何实现复杂的审批规则,如并行审批、条件分支等。 9. 流程监听器和事件:利用监听器和事件机制来监控流程...
5. **服务任务与API**:Activiti 提供了丰富的服务任务,如调用外部服务、定时任务等。开发者可以通过API与这些任务交互,实现流程中的业务逻辑。 6. **表达式与脚本**:Activiti 支持使用EL(Expression Language...
- **启用Job执行器**:配置定时任务处理器。 - **配置邮件服务器**:发送邮件通知等功能。 - **配置历史**:记录流程实例的历史数据。 - **为表达式和脚本暴露配置**:允许在流程定义中使用表达式和脚本。 - **配置...
系统监控:系统日志、接口api、系统监控、可配置定时任务 前端可配置化定时任务。 采用swagger可视化出实时方法格式以及数据属性,采用阿里druid 工作流程管理:完全实现模块化,无侵入。 流程管理:动态给发布流程...
- **简要描述**:存储运行时定时任务数据。 ##### 21. 运行时任务节点表 (act_ru_task) - **简要描述**:存储运行时任务数据。 ##### 22. 运行时流程变量数据表 (act_ru_variable) - **简要描述**:存储运行时...