QWorker更新-修正了多个同一时间点重复作业会造成重复卡死的问题

【问题描述】

该问题是由于在TQRepeatJobs.InternalPop函数在弹出作业时,忘记设置弹出作业的Next为空引起的。下面的代码可以简单的触发该问题:

Workers.Post(DoNullJob, 10000, Pointer(1));
Workers.Post(DoNullJob, 10000, Pointer(2));
Workers.Post(DoNullJob, 10000, Pointer(3));

问题代码

function TQRepeatJobs.InternalPop: PQJob;
...
      if AJob.Runonce then
        Result := AJob
      else
        begin
        AJob.Next:=nil;<-- 少了这句 -->
        Inc(AJob.NextTime, AJob.Interval);
        Result := JobPool.Pop;
...

由于该问题,会造成TQRepeatJobs的作业链表出错,在触发作业的AfterRun时更新原始作业状态时陷入死循环,多次重复后,会耗尽所有的Worker资源,造成无法处理任何作业。

【严重级别】

【更新级别】

立即更新

【特别感谢】

简单生活、厦门小叶报告此问题。

分享到: