Использование Gin Gonic и некоторого планировщика в Golang

У меня есть служба REST в Gin Gonic, и мне нужно выполнять какую-то работу каждые 5 секунд, используя какой-то планировщик. я пробовал rakanalh а также gocron но кажется, что каждый код, написанный после инициализации cron или джина, не будет выполнен.

func main() {
    settings.AppSettings = settings.ReadSettings()

    db.InitOracleDataBase()
    OracleEnv, OracleSrv, OracleSes := db.GetOracleDB()
    defer OracleEnv.Close()
    defer OracleSrv.Close()
    defer OracleSes.Close()

    routes.Init()


    gocron.Every(5).Seconds().Do(prOk)
    <-gocron.Start()


}

prOk просто печатает ОК, и он никогда не будет выполнен, пока я не прокомментирую routes.init(), Как можно одновременно выполнять маршруты cron и gin?

2 ответа

Решение

Вы должны выполнить gocron внутри goroutine, так как основной goroutine будет блокировать (я думаю, routes.Init() тоже запускает HTTP-сервер?)

func main() {
    settings.AppSettings = settings.ReadSettings()

    db.InitOracleDataBase()
    OracleEnv, OracleSrv, OracleSes := db.GetOracleDB()
    defer OracleEnv.Close()
    defer OracleSrv.Close()
    defer OracleSes.Close()

    go func() {
        gocron.Every(5).Seconds().Do(prOk)
        <-gocron.Start()
    }()

    routes.Init()
}

Я делаю нечто подобное, где я кеширую некоторые результаты API и обновляю кеш каждые несколько секунд. Я не использую ничего кроме стандартной библиотеки, хотя. Вот пример кода.

func UpdateCache() {
    var lock sync.Mutex
    timer1 := time.NewTicker(time.Second * 10) 
    defer timer1.Stop()
    timer2 := time.NewTicker(time.Second * 5) 
    defer timer2.Stop()
    for {
        /* run forever */
        select {
        case <-timer1.C:
            go func() {
                lock.Lock()
                defer lock.Unlock()
                /* do things I need done every 10 seconds */
            }()
        case <-timer2.C:
            go func() {
                lock.Lock()
                defer lock.Unlock()
                /* do things I need done every 5 seconds */
            }()
        }
    }
}

И в основном () у меня есть

go UpdateCache()
router := gin.Default()
/* setup all the routes */
listen := os.Getenv("SERVICE_ADDR")
router.Run(listen)

Я думаю, что проблема, с которой вы сталкиваетесь, заключается в том, что вы начинаете запускать свои маршруты в маршрутах.Init() блокирует их и никогда не попадает в настройки cron.

Другие вопросы по тегам