Kratos 集成定时任务Cron

  • 定义定时任务
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
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容