-
Notifications
You must be signed in to change notification settings - Fork 2
/
history.go
64 lines (57 loc) · 1.42 KB
/
history.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package schedule
import (
"time"
"github.com/asaskevich/EventBus"
"github.com/robfig/cron/v3"
"go.uber.org/zap"
)
const (
// EventJobStarted = "event.job.started"
// EventJobDone = "event.job.done"
// EventJobFailed = "event.job.failed"
EventJobFinished = "event.job.finished"
EventJobFailed = "event.job.failed"
)
type JobHistory struct {
Job string
Start time.Time
Finished time.Time
Duration time.Duration
Succeed bool
Message string
}
func Withhistory(bus EventBus.Bus, jobname string) cron.JobWrapper {
return func(j cron.Job) cron.Job {
return cron.FuncJob(
func() {
logger := zap.L().With(zap.String("jobname", jobname))
logger.Debug("mark job started")
task := &JobHistory{
Job: jobname,
Start: time.Now(),
Succeed: true,
}
defer func() {
if r := recover(); r != nil {
if err, ok := r.(error); ok {
task.Message = err.Error()
logger.Error("recover from panic", zap.Error(err), zap.String("job", task.Job))
} else if msg, ok := r.(string); ok {
task.Message = msg
logger.Info(msg)
}
task.Succeed = false
}
logger.Info("job done")
done := time.Now()
task.Duration = time.Since(task.Start)
task.Finished = done
logger.Debug("job end", zap.Duration("duration", task.Duration))
if bus != nil {
bus.Publish(EventJobFinished, task)
}
}()
j.Run()
})
}
}