Because of an already fixed issue, Tom move dbSession.delete(task) from TaskActivity.signal() to TaskImpl.complete(). So if we call TaskService.completeTask() and signal the related execution. The task will alway be deleted before execution.signal(). So we could use it to judge who are calling signal() method. If we can not find the task for current execution, it will be the normal way, and task had been completed normally. If there is still a task for current execution. This task must be out of date.
Here is the issue.
Yes, I know we still cannot tell whether there is a timerout event occurred and it is surely a design problem. But directly add a timeout() to ExternalActivityBehaviour is not a good design, too.