目录
前言
在前面的文章 Camunda - 参数lockDuration与asyncResponseTimeout 中介绍了External Task中的两个重要参数, 本文通过一个简单的例子,让大家感受参数设置不当,导致external产生的异常。
External Task实验
1.实验目的:
验证Camunda external task参数asyncResponseTimeout值设置对程序运行是否有影响
2. 实验背景:
2.1 实验的流程图如下,极简风格

2.2 采用camunda-external-task-client.jar的方式继承到Java代码中,同时通过启动程序代码相同,文件名不同的两个Java进程,来模拟微服务多实例的运行方式。
3.实验条件:
将asyncResponseTimeout的值设置为10s, 程序中通过Thread.sleep(60*1000);模拟外部任务的执行耗时大于10s, 上代码很简单, 同样的代码复制了两份,为了区分,分别在print的时候设置了两个不同的名称instance1和instance2。
代码如下
public static void main(String[] args) {
SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
ExternalTaskClient client = ExternalTaskClient.create()
.baseUrl("http://localhost:8080/engine-rest")
.asyncResponseTimeout(10000)
.build();
client.subscribe("lock-duration")
.handler((externalTask, externalTaskService) -> {
Date date = new Date(System.currentTimeMillis());
System.out.println(formatter.format(date)+"# execute lock-duration instance2");
try {
Thread.sleep(60*1000);
Date date2 = new Date(System.currentTimeMillis());
System.out.println(formatter.format(date2)+"# complete lock-duration instance2");
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
externalTaskService.complete(externalTask);
})
.open();
}
4.实验结果
分别启动instance1和instance2对应的Java进程,在上面流程图中启动一个流程实例。
以下是instance1打印的信息

以下是instance2打印的信息

结果:
1)lock-duration的外部任务在instance1和instance2中多次执行。
2)程序层面抛出异常
ERROR org.camunda.bpm.client - TASK/CLIENT-03004 Exception on external task service method invocation for topic 'lock-duration':
org.camunda.bpm.client.exception.NotAcquiredException: TASK/CLIENT-01007 Exception while completing the external task: The task's most recent lock could not be acquired
总结
如果你的Camunda External Task也抛出了NotAcquiredException 和The task's most recent lock could not be acquired此类的信息,可以往外部任务执行的耗时远超过asyncResponseTimeout设置的时间,导致多个External Task Worker重复消费的问题,适当调整或取消asyncResponseTimeout设置
703

被折叠的 条评论
为什么被折叠?



