Golang中如何移除cron包的所有任务

Golang中如何移除cron包的所有任务 我正在使用 /robofig/cron 包,并添加了一个每15分钟运行一次的定时任务,该任务从数据库表中获取行数据。每行包含一个任务及其运行时间表。我遍历这些行,并根据每行的时间表将其添加到定时任务中。

现在,每15分钟后,主定时任务会更新从数据库表中获取的所有行数据数组,然后上述过程会重复进行。

问题是,每15分钟,这些行数据会不断添加到定时任务中,导致所有内容重复。如何在每15分钟后重新添加任务之前,清空所有先前添加的任务,同时保持主定时任务继续运行?

// 代码示例:如何清空所有定时任务
func main() {
    // 初始化cron实例
    c := cron.New()
    
    // 添加任务
    c.AddFunc("*/15 * * * *", func() {
        // 清空现有任务
        c.Stop()
        
        // 重新从数据库获取数据并添加新任务
        // ...
        
        // 重新启动cron
        c.Start()
    })
    
    // 启动cron
    c.Start()
    
    // 保持程序运行
    select {}
}

更多关于Golang中如何移除cron包的所有任务的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang中如何移除cron包的所有任务的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


/robfig/cron 包中,你可以通过以下方式移除所有任务并重新添加:

package main

import (
    "github.com/robfig/cron/v3"
    "sync"
)

func main() {
    c := cron.New()
    var mu sync.Mutex
    entries := make(map[cron.EntryID]bool)

    // 主定时任务:每15分钟更新一次
    c.AddFunc("*/15 * * * *", func() {
        mu.Lock()
        defer mu.Unlock()

        // 移除所有现有任务
        for id := range entries {
            c.Remove(id)
        }
        entries = make(map[cron.EntryID]bool)

        // 从数据库获取新数据
        rows := fetchFromDB()
        
        // 添加新任务
        for _, row := range rows {
            id, err := c.AddFunc(row.Schedule, func() {
                // 执行具体任务
                executeTask(row.Task)
            })
            if err == nil {
                entries[id] = true
            }
        }
    })

    c.Start()
    select {}
}

// 模拟数据库查询
func fetchFromDB() []struct {
    Schedule string
    Task     string
} {
    return []struct {
        Schedule string
        Task     string
    }{
        {"*/5 * * * *", "task1"},
        {"0 */2 * * *", "task2"},
    }
}

func executeTask(task string) {
    // 执行任务逻辑
}

更简洁的方案是使用 cron.New() 创建新实例替换旧实例:

func main() {
    var c *cron.Cron = cron.New()
    
    c.AddFunc("*/15 * * * *", func() {
        // 停止并丢弃旧实例
        c.Stop()
        
        // 创建新实例
        c = cron.New()
        
        // 添加主定时任务
        c.AddFunc("*/15 * * * *", updateTasks)
        
        // 添加从数据库获取的任务
        rows := fetchFromDB()
        for _, row := range rows {
            c.AddFunc(row.Schedule, func() {
                executeTask(row.Task)
            })
        }
        
        c.Start()
    })
    
    c.Start()
    select {}
}

func updateTasks() {
    // 这个函数会被新实例调用
}

如果你使用的是 v3 版本,可以直接操作 c.Entries()

func removeAllJobs(c *cron.Cron) {
    for _, entry := range c.Entries() {
        c.Remove(entry.ID)
    }
}

// 使用示例
c.AddFunc("*/15 * * * *", func() {
    removeAllJobs(c)
    
    // 保留主定时任务
    c.AddFunc("*/15 * * * *", updateTasks)
    
    // 添加新任务
    rows := fetchFromDB()
    for _, row := range rows {
        c.AddFunc(row.Schedule, func() {
            executeTask(row.Task)
        })
    }
})

注意:在移除任务时,主定时任务本身也会被移除,所以需要重新添加。

回到顶部