bamzi / jobrunner

Framework for performing work asynchronously, outside of the request flow
MIT License
1.04k stars 99 forks source link

Job run multi times after stop -> start #12

Closed namkazt closed 5 years ago

namkazt commented 5 years ago

So my case is when i stop the job:

        entries := jobrunner.StatusPage()
    for _, e := range entries {
        if e.JobRunner.Name == task.ID.Hex() {
            gocore.Log().Info().Str("id", task.ID.Hex()).Str("desc", task.Description).Msg("Stopped task")
            jobrunner.Remove(e.Id)
            break
        }
    }

and add it back after a time

                job := jobrunner.New(SendNotification{
            Title: jsoniter.Get(rawData, "title").ToString(),
            Message: jsoniter.Get(rawData, "message").ToString(),
        })
        job.Name = task.ID.Hex()
        sched, err := cron.Parse(task.CronExpression)
        if err != nil {
            gocore.Log().Error().Err(err).Msg("Error when run schedule task data")
            return
        }
        jobrunner.MainCron.Schedule(sched, job)

this job run multi time before it actualy going correct depend on how long i stop the task

here is details log:


2019-08-07T11:42:22+07:00 DBG D:/Works/Radiant/Tokkor_server/sub_admin/backend/src/HandleScheduler.go:256 > Error when decode schedule task data msg="With a message here" title="Cool title "
2019-08-07T11:42:22+07:00 DBG D:/Works/Radiant/Tokkor_server/sub_admin/backend/src/HandleScheduler.go:256 > Error when decode schedule task data msg="With a message here" title="Cool title "
2019-08-07T11:42:22+07:00 DBG D:/Works/Radiant/Tokkor_server/sub_admin/backend/src/HandleScheduler.go:256 > Error when decode schedule task data msg="With a message here" title="Cool title "
2019-08-07T11:42:22+07:00 DBG D:/Works/Radiant/Tokkor_server/sub_admin/backend/src/HandleScheduler.go:256 > Error when decode schedule task data msg="With a message here" title="Cool title "
2019-08-07T11:42:22+07:00 DBG D:/Works/Radiant/Tokkor_server/sub_admin/backend/src/HandleScheduler.go:256 > Error when decode schedule task data msg="With a message here" title="Cool title "
2019-08-07T11:42:22+07:00 DBG D:/Works/Radiant/Tokkor_server/sub_admin/backend/src/HandleScheduler.go:256 > Error when decode schedule task data msg="With a message here" title="Cool title "
2019-08-07T11:42:22+07:00 DBG D:/Works/Radiant/Tokkor_server/gocore/HandlerInterface.go:62 > Response: {"code":1,"data":{"rows":[{"id":"5d4a52c60c25a02b04e61c70","description":"This is a test every 5 seconds","data":"{\"type\":1,\"title\":\"Cool title \",\"message\":\"With a message here\"}","cron":"0/5 * * * * ?","enable":true,"created_date":"2019-08-07T04:25:42.514Z"}],"total":1},"msg":"Request success"}
2019-08-07T11:42:22+07:00 DBG D:/Works/Radiant/Tokkor_server/gocore/AppConfig.go:100 > Post data desc=["ASC"] filter=[""] page=["1"] rows=["8"] sort_by=["null"]
2019-08-07T11:42:22+07:00 INF Request ip=192.168.1.10 latency=3.9896 method=POST path=/api/v1/scheduler/page status=200 user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36"
2019-08-07T11:42:25+07:00 DBG D:/Works/Radiant/Tokkor_server/sub_admin/backend/src/HandleScheduler.go:256 > Error when decode schedule task data msg="With a message here" title="Cool title "
2019-08-07T11:42:30+07:00 DBG D:/Works/Radiant/Tokkor_server/sub_admin/backend/src/HandleScheduler.go:256 > Error when decode schedule task data msg="With a message here" title="Cool title "
2019-08-07T11:42:35+07:00 DBG D:/Works/Radiant/Tokkor_server/sub_admin/backend/src/HandleScheduler.go:256 > Error when decode schedule task data msg="With a message here" title="Cool title "
2019-08-07T11:42:37+07:00 INF D:/Works/Radiant/Tokkor_server/sub_admin/backend/src/HandleScheduler.go:243 > Stopped task desc="This is a test every 5 seconds" id=5d4a52c60c25a02b04e61c70```

it run 6 times continuos before actually running correct every 5 seconds
namkazt commented 5 years ago

so i came with 1 solution for now is on cron.go at run functions:

case newEntry := <-c.add:
            now = time.Now().Local() // <--- set now as current time before add and calculate next call time
            c.entries = append(c.entries, newEntry)
            newEntry.Next = newEntry.Schedule.Next(now)

edit: update now at end of loop seem not good because it will be update after other channel was called.

namkazt commented 5 years ago

sorry it is a bug in old cron version. closed fixed in #13