在Golang中使用Gin Gonic和一些调度程序

mon*_*guy 2 go gin-gonic

我在Gin Gonic中有一些REST服务,并且我需要每5秒使用一些调度程序来做一些工作。我已经尝试过了rakanalhgocron但是似乎在初始化crons或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()


}
Run Code Online (Sandbox Code Playgroud)

prOk只是打印OK,在我发表评论之前它永远不会执行routes.init()。如何同时运行cron和gin路由?

Mad*_*bat 5

我正在做类似的事情,我缓存一些 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 */
            }()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在 main() 我有

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

我认为您遇到的问题是您开始在 routes.Init() 中运行您的路线并且它阻塞并且永远不会进入您的 cron 设置。


Rag*_*aer 5

您需要在goroutine中执行gocron,因为主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()
}
Run Code Online (Sandbox Code Playgroud)