浏览 10500 次
锁定老帖子 主题:Activiti定时任务示例
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2013-01-25
最后修改:2013-01-25
这不,这周公司经理叫我在前段时间的基础上,把项目中的一个客户回访计划的提醒功能也加到工作流当中,对于没有接触过定时任务的我来说,又有的一番研究了。 在 咖啡兔 的提醒下,使用了边界定时事件 + 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 如有不明白之处大家可以共同讨论。 如果你有更好的方案,也可以提出来,大家共同探讨。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2013-01-30
嗯,不错,我也遇到类似的问题,我的定时器超时后流向serviceTask,但是这个serviceTask总是不能实例化,也不知道是什么原因。不知楼主是否遇到这样的问题?
|
|
返回顶楼 | |
发表时间:2013-02-01
wslovenide 写道 嗯,不错,我也遇到类似的问题,我的定时器超时后流向serviceTask,但是这个serviceTask总是不能实例化,也不知道是什么原因。不知楼主是否遇到这样的问题?
你要看看你的Service Task 中的配置,多半原因是因为你的Service Task中使用了activiti:delegateExpression或者activiti:expression这样的配置,然后配置中需要的流程变量信息在流程中没有找到。 具体错误原因还是要看你的错误日志的输出内容是什么? 如果你能有的话, 贴到 ;https://gist.github.com/上面 我帮你看看。 |
|
返回顶楼 | |