在Golang中运行cron,同时拥有不同的数据库

问题描述 投票:-1回答:1

我正在开发一个基于SaaS的项目,商家可以订阅该项目来设置他们的在线商店。

项目概况

我正在使用Golang(后端),Mongodb数据库服务和Angular4(前端)来构建系统。我有多个商家可以设置他们的商店。每个商家都有自己的网址(将其商家名称作为网址中的子网域)连接到他的数据库。

对于路由,我在后端使用Golang的Gin框架。

问题

我想为特定于商家的数据库运行cron作业。在这些cron作业中,有一些操作需要连接到数据库。但是在我的路由中,在调用API的路由之前,将不会设置数据库。最终,cron没有运行适当的数据。

cron.go

package cron

import (
    "gopkg.in/robfig/cron.v2"
    "controllers"
)
func RunCron(){ 
  c := cron.New()
  c.AddFunc("@every 0h1m0s", controllers.ExpireProviderInvitation)
  c.Start()
}

控制器功能

func ExpireProviderInvitation() {
    bookingAcceptTimeSetting, _ := models.GetMerchantSetting(bson.M{"section": "providers", "option_name": "bookings_accept_time"})
    if bookingAcceptTimeSetting.OptionValue != nil{
        allInvitations, _ := models.GetAllBookingInvitations(bson.M{ "status": 0, "send_type": "invitation", "datetime": bson.M{"$le": float64(time.Now().Unix()) - bookingAcceptTimeSetting.OptionValue.(float64)} })
        if len(allInvitations) > 0 {
            for _, invitationData := range allInvitations {
                _ = GetNextAvailableProvider(invitationData.Bid, invitationData.Pid)
            }
        }
    }   
}

router.go

func NewRouter() {
    router := gin.Default()
    router.Use(gin.Recovery())
    router.Use(SetMerchantDatabase)

    public := router.Group("/api/v1")
    for _, route := range publicRoutes{
        switch route.Method {
            case    "GET"   :   public.GET(route.Pattern, route.HandlerFunc)
            case    "POST"  :   public.POST(route.Pattern, route.HandlerFunc)
            case    "PUT"   :   public.PUT(route.Pattern, route.HandlerFunc)
            case    "DELETE":   public.DELETE(route.Pattern, route.HandlerFunc) 
            default         :   public.GET(route.Pattern, func(c *gin.Context){
                                    c.JSON(200, gin.H{
                                        "result": "Specify a valid http method with this route.",
                                    })
                                })
        }
    }
    router.NoRoute(controllers.UnauthorizedAccessResponse)
    router.Run(":8080")
}

func SetMerchantDatabase(c *gin.Context){
    subdomain := strings.Split(c.Request.Host, ".")

    if len(subdomain) > 0{
        config.Database = subdomain[0]
        config.CurrentBusinessName = subdomain[0]
    }else{
        errMsg := "Failed: Invalid domain in headers."
        response := controllers.ResponseController{
            config.FailureCode,
            config.FailureFlag,
            errMsg,
            nil,
        }
        controllers.GetResponse(c, response)
        c.Abort()
    }
    c.Next()
}

main.go

package main

import (
    "cron"
)

func main(){
    cron.RunCron()
    NewRouter()
} 

上述代码的说明

示例路由可以是:

Route{ "AddCustomer", "POST", "/customer", controllers.SaveCustomer },

示例API网址可以是:

http://business-name.main-domain.com/api/v1/customer

其中“business-name”是在调用API时设置的数据库。我想在不调用API路由的情况下运行我的cron。

替代方法

在Shell脚本中,我们可以通过将url命名为命令来运行cron。为此,我可以创建一个url来将其作为命令运行。但这是我的理论方法。另外我不知道如何获得不同的商家数据库。

我不确定这种方法是否有效。任何形式的帮助将不胜感激。

mongodb go cron
1个回答
2
投票

您需要调整SetMerchantDatabase以独立于您的路由器工作。然后你也可以让它为Cron设置一些东西。

© www.soinside.com 2019 - 2024. All rights reserved.