Camunda实战:定时器与服务任务(六)

最近因为要做一个审批人超时未审批催促(提醒)的功能,所以研究了一下Camunda的定时和服务任务,这里做了一个简单的Demo记录一下。

1.首先来明确一下概念:
定时器事件(Timer Event)用来在特定的日期、时间,或者一定的周期触发一个事件。比如在大年三十晚上的9:00触发一个事件。或者像闹钟一样,每天定时触发一个事件。定时器事件是由定义好的定时器触发的事件。他们可以用作开始事件、中间事件或者边界事件。边界事件可以是中断的,也可以是非中断的。
这里涉及到的概念比较多,大家如果想系统的学习,可以买一本书看,或者看官方的文档。
在这里插入图片描述
这本书也没有评价,我也没有看完,因为是刚开始学Camunda,网上的资料杂而乱,看到有这么一本书,就先拿来看看,最起码可以从书中明确一些基本的概念和功能,对深入挖掘和研究camunda 起到基础的作用,今天主要讲定时器和服务任务,其他的东西就先不说了,如果有小伙伴想一起研究可以私信我价格QQ微信啥的一起共同学习。我之前加过一个Camunda的QQ群,还比较活跃,感兴趣的小伙伴可以加入:650886724
好了回归正题。
服务任务概念这里就不多说了,大家可以自行百度。
2.我直接上流程图吧。
在这里插入图片描述
由上图可以看出,流程开始后->销售主管审批->有一个定时器(也就是1分钟以后执行后面的服务任务)->服务任务(发送通知)
定时器的参数如下:
在这里插入图片描述
PT1M 的意思是1分钟以后执行。当然这里可以设置周期,也可以设置在什么时候执行,这里不在多说。
对了这里的这个 PT1M ,也可以写成一个变量比如:${duration},然后在流程发起的时候把变量传进去即可:map.put(“duration”, “PT1M”); 这样一来,这个定时的参数就可以做活了,通过变量去控制,非常灵活。

服务任务的参数如下:
在这里插入图片描述
我这里使用的Delegate Exception ,也可以使用Java Class,如果选的是Java Class ,可以放上java类的绝对路径,也就是说事件一到,就会调用你的java类。
Delegate Exception 也一样,如果是spring boot 项目,这里可以写bean的名称
3.我的java代码如下,大家看代码就会一目了然:


import lombok.extern.slf4j.Slf4j;
import org.camunda.bpm.engine.TaskService;
import org.camunda.bpm.engine.delegate.DelegateExecution;
import org.camunda.bpm.engine.delegate.JavaDelegate;
import org.camunda.bpm.engine.task.Task;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

/**
 * @Author 
 * @Desc 超时提醒监听类类
 * @Date 2022-06-01 19:51
 **/
@Slf4j
@Service("timeoutRemindDelegate")
public class TimeoutRemindDelegateListener implements JavaDelegate {

    @Resource
    private TaskService taskService;

    @Override
    public void execute(DelegateExecution execution) throws Exception {
        log.info("TimeoutRemindDelegate.execute start, execution: {}", execution);

        // 获取当前节点的所有待办任务
        List<Task> taskList = taskService.createTaskQuery()
                .processInstanceId(execution.getProcessInstanceId())
                .list();
        for (Task task: taskList) {
            String assignee = task.getAssignee();
            log.info("assignee:"+assignee);
            // 实现保存记录表,发送语音提醒或短信提醒
        }

        log.info("TimeoutRemindDelegate.execute end");
    }
}

TimeoutRemindDelegateListener 需要实现 org.camunda.bpm.engine.delegate.JavaDelegate 类,重写 com.renrenche.base.service.camunda.delefate.TimeoutRemindDelegateListener#execute 方法,也就是在这个流程图中到了事件就会调用这个方法,在这个方法中就可以写你的业务代码去实现你的业务逻辑。
好了,这个时候我们来发起一下这个流程。
这个时候销售主管审批这个节点的审批人会有一条待办任务,我们先不要批,先来看一下,camunda数据库中的这个表:
select * from act_ru_job order by CREATE_TIME_ desc;

在这里插入图片描述
发现没有数据,接下来我们审批一下销售主管节点的待办。

在这里插入图片描述
审批以后发现多了一条记录(见上图),我们来详细看一下这两个字段:
DUEDATE_ , CREATE_TIME_

在这里插入图片描述
发现其实在销售主管审批这个节点的人已审批通过就会在act_ru_job表中添加一条记录,并且会根据定时器节点的参数计算出下一次执行的时间(也就是DUEDATE_)
我们等了一分钟之后,看程序果然进入了我们写的java类:
在这里插入图片描述
至此,我们就可以使用这个demo去实现我们的业务逻辑。
但是文中开头的需求:“超时自动催促(提醒功能)”可能不行,因为在这个流程图中的定时器是可以中断流程的,显然我们的需求是不能够中断我们的流程的,也就是说如果还没有超过30分钟,审批人已经审批了,那么其实这个提醒功能就不用了。
我们再上面说过:边界事件可以是中断的,也可以是非中断的。那其实可以使用非中断的边界事件。如何实现呢?请看下一篇。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值