Использование Gin Gonic и некоторого планировщика в Golang - PullRequest
0 голосов
/ 09 октября 2018

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

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 просто печатает OK, и он никогда не будет выполнен, покаЯ комментирую routes.init().Как можно одновременно выполнять маршруты cron и gin?

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Вам нужно выполнить 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()
}
0 голосов
/ 09 октября 2018

Я делаю нечто подобное, где я кеширую некоторые результаты 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 */
            }()
        }
    }
}

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

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

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

...