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);
}
网友评论