美文网首页
流程引擎Camunda开发记录(九)外部任务系列

流程引擎Camunda开发记录(九)外部任务系列

作者: _花 | 来源:发表于2022-04-29 17:31 被阅读0次

Camunda提供了外部任务,外部任务由外部应用去创建,引擎并不太会干预外部任务
ExternalTask 是ServiceTask的衍伸,但ServiceTask是非等待节点,流程执行实例经过ServiceTask节点时,直接经过并完成实例节点,而ExternalTask是等待节点,执行实例试行到此,会等待该任务的完成。

当你的流程实例流转到外部任务节点时,会向ACT_RU_EXT_TASK插入一条数据

1.获取外部任务的方法有

ExternalTaskQuery query = externalTaskService.createExternalTaskQuery();

2.外部服务进行抓取与锁定:

锁定

        long t = Long.parseLong(lockDuration);
        externalTaskService.lock(taskId, workerId, t);

解锁

        externalTaskService.unlock(externalTaskId);

外部服务可以定期来抓去自己关注的外部任任务并进行锁定

 @Test
    public void fetchAndLock() {
        int maxTasks = 5;
        String workerId = "peng1";
        boolean usePriority = true;
        int lockDuratio = 1000 * 60 * 10;
        List<LockedExternalTask> lockedExternalTaskList = externalTaskService
          .fetchAndLock(maxTasks, workerId, usePriority)
                .topic("topic1", lockDuratio)
                .execute();

        for (LockedExternalTask lockedExternalTask : lockedExternalTaskList) {
            System.out.println("#########");
            System.out.println(lockedExternalTask.getPriority());
            System.out.println(lockedExternalTask.getId());
            System.out.println(lockedExternalTask.getTopicName());
            System.out.println("#########");
        }
    }

fetchAndLock需要指定一次性抓取的外部任务的数量和执行人,外部服务也可以设置当前抓取的外部任务的主题

3.多主题多条件查询

前提是该任务上次锁定时间还没有过期
外部任务可以多次被不同的人锁定抓取,锁定时间和锁定人会随着每次抓取更新

4.完成外部任务

//成功
externalTaskService.complete(taskId, workderId, map);
//失败
externalTaskService.handleFailure(taskId, workderId, msg, retries, retryTimeOut);

完成外部任务后,外部任务会从ACT_RU_EXT_TASK表中删除

5.外部任务过期时间更新:

    @Test
    public void fetchAndLock2() {
        //锁定时间变更为:当前时间+5分钟
        Date date = new Date();
        date.setMinutes(date.getMinutes() - 5);
        ClockUtil.setCurrentTime(date);
        String externalTaskId = "2006";
        String workerId = "peng3";
        long lockDuration = 1000 * 60 * 10;
        externalTaskService.extendLock(externalTaskId, workerId, lockDuration);

        //或不用ClockUtil,直接        long lockDuration = 1000 * 60 * 5;
    }

6.重试次数优先级批更新及解锁

 @Test
    public void setRetries() {
        String externalTaskId = "2006";
        int retries = 4;
        externalTaskService.setRetries(externalTaskId, retries);
    }



    @Test
    public void setPriority() {
        String externalTaskId = "2006";
        int priority = 1000;
        externalTaskService.setPriority(externalTaskId, priority);
    }

相关文章

网友评论

      本文标题:流程引擎Camunda开发记录(九)外部任务系列

      本文链接:https://www.haomeiwen.com/subject/lubsyrtx.html