During the execution process of scheduled tasks, a change in the system time can result in incorrect execution timing.
ssongliu opened this issue · 2 comments
Hello @robfig.
Thank you very much for providing such excellent code! but I have encountered an issue while using it.
Suppose the current time is 2023-11-02 09:00:00, and I've enabled a scheduled task to run at 10:30 every day.
(Based on the code and the current time, a 1-hour timer will be activated.)
for {
// Determine the next entry to run.
sort.Sort(byTime(c.entries))
var timer *time.Timer
if len(c.entries) == 0 || c.entries[0].Next.IsZero() {
// If there are no entries yet, just sleep - it still handles new entries
// and stop requests.
timer = time.NewTimer(100000 * time.Hour)
} else {
timer = time.NewTimer(c.entries[0].Next.Sub(now))
}
...
Change the system time to 2023-11-05 06:00:00.
(When the timer runs one hour later, it starts execution, and at that time, the system time is 2023-11-05 07:00:00.) At this point, the execution condition only relies on the following code:
if e.Next.After(now) || e.Next.IsZero() {
break
}
It will pass this condition and execute the scheduled task without matching the originally set execution time of 10:30.
Thanks.
Hello @robfig.
Thank you very much for providing such excellent code! but I have encountered an issue while using it.
Suppose the current time is 2023-11-02 09:00:00, and I've enabled a scheduled task to run at 10:30 every day. (Based on the code and the current time, a 1-hour timer will be activated.)
for { // Determine the next entry to run. sort.Sort(byTime(c.entries)) var timer *time.Timer if len(c.entries) == 0 || c.entries[0].Next.IsZero() { // If there are no entries yet, just sleep - it still handles new entries // and stop requests. timer = time.NewTimer(100000 * time.Hour) } else { timer = time.NewTimer(c.entries[0].Next.Sub(now)) } ...
Change the system time to 2023-11-05 06:00:00. (When the timer runs one hour later, it starts execution, and at that time, the system time is 2023-11-05 07:00:00.) At this point, the execution condition only relies on the following code:
if e.Next.After(now) || e.Next.IsZero() { break }
It will pass this condition and execute the scheduled task without matching the originally set execution time of 10:30.
Thanks.
系统时间都改了,这种表现是正常的啊,我觉得没啥问题
Hello @robfig.
Thank you very much for providing such excellent code! but I have encountered an issue while using it.
Suppose the current time is 2023-11-02 09:00:00, and I've enabled a scheduled task to run at 10:30 every day. (Based on the code and the current time, a 1-hour timer will be activated.)
for { // Determine the next entry to run. sort.Sort(byTime(c.entries)) var timer *time.Timer if len(c.entries) == 0 || c.entries[0].Next.IsZero() { // If there are no entries yet, just sleep - it still handles new entries // and stop requests. timer = time.NewTimer(100000 * time.Hour) } else { timer = time.NewTimer(c.entries[0].Next.Sub(now)) } ...
Change the system time to 2023-11-05 06:00:00. (When the timer runs one hour later, it starts execution, and at that time, the system time is 2023-11-05 07:00:00.) At this point, the execution condition only relies on the following code:
if e.Next.After(now) || e.Next.IsZero() { break }
It will pass this condition and execute the scheduled task without matching the originally set execution time of 10:30.
Thanks.
This doesn't seem to be a problem for this library to deal with. The issues should be closed.