我正在开发一个基于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来将其作为命令运行。但这是我的理论方法。另外我不知道如何获得不同的商家数据库。
我不确定这种方法是否有效。任何形式的帮助将不胜感激。
您需要调整SetMerchantDatabase
以独立于您的路由器工作。然后你也可以让它为Cron设置一些东西。