gpt4 book ai didi

mongodb - 在具有不同数据库的情况下在 Golang 中运行 cron

转载 作者:数据小太阳 更新时间:2023-10-29 03:32:52 25 4
gpt4 key购买 nike

我正在从事一个基于 SaaS 的项目,商家可以订阅该项目来建立他们的在线商店。

项目概览

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

对于路由,我在后端使用 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()
}

Controller 函数

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()
}

ma​​in.go

package main

import (
"cron"
)

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

上面代码的解释

示例路线可以是:

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

一个示例 API url 可以是:

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

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

替代方法

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

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

最佳答案

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

关于mongodb - 在具有不同数据库的情况下在 Golang 中运行 cron,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47979278/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com