Camunda - external task之NotAcquiredException

目录

前言

1.实验目的:

2. 实验背景:

3.实验条件:

 4.实验结果

总结


前言

在前面的文章 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设置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhao_rock_2016

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值