package data
import (
"shop/internal/biz"
"time"
"github.com/robfig/cron"
)
// 定时任务
type ChangedShopLog struct {
Data Data
}
func (c *ChangedShopLog) Run() {
// 一次性扫全表,如果数据量很大,很消耗内存。需要使用 rows.Next
rows, err := c.Data.db.Table(biz.SHOPLOG_TABLE_NAME).Where("type = 1").Rows()
if err != nil {
c.Data.log.Errorf("timer scan fial , err: %v", err)
return
}
// 释放连接
defer rows.Close()
// 每行单独加载执行业务
for rows.Next() {
var logData biz.ShopLog
c.Data.db.ScanRows(rows, &logData)
// 状态为正在出售,并且自动下架时间在当前时间之前
if logData.Type == 1 && (logData.AutoEndTime < time.Now().Unix()) {
}
}
}
func InitTimer(data Data) {
Conrs := cron.New() // 定时任务
Conrs.Start()
// 每五秒: */5 * * * * ?
// 每隔1分钟执行一次:"0 */1 * * * ?"
// 每天23点执行一次:"0 0 23 * * ?"
// 每天凌晨1点执行一次:"0 0 1 * * ?"
// 每月1号凌晨1点执行一次:"0 0 1 1 * ?"
// 在26分、29分、33分执行一次:"0 26,29,33 * * * ?"
// 每天的0点、13点、18点、21点都执行一次:"0 0 0,13,18,21 * * ?"
Conrs.AddJob("*/5 * * * * ?", &ChangedShopLog{
Data: data,
})
}
- 注入Data执行,本业务场景定时任务需要操作一些数据,所以直接在Data调用
// NewData .
func NewData(db *gorm.DB, rd *redis.Client, kfk *kk.Kafka, logger log.Logger) (*Data, func(), error) {
log := log.NewHelper(log.With(logger, "module", "shop-service/data"))
d := &Data{
rd: rd,
db: db,
kfk: kfk,
log: log,
}
// 在此监听配置改变
go func() {
for v := range conf.Ch {
LoadToRedis(v, rd)
}
}()
// 启动定时任务
go InitTimer(*d)
return d, func() {
}, nil
}