From 260453be693bf0c02552a4ab5d59ddb58a5c9391 Mon Sep 17 00:00:00 2001 From: gazebo Date: Sat, 21 Jul 2018 13:30:43 +0800 Subject: [PATCH] - RefreshWeixinToken and RefreshElmToken firs time run must completed before main workflow going. --- business/scheduler/defsch/defsch.go | 2 +- legacy/tasks/configrefresh.go | 107 +++++++++++++++------------- main.go | 11 ++- 3 files changed, 69 insertions(+), 51 deletions(-) diff --git a/business/scheduler/defsch/defsch.go b/business/scheduler/defsch/defsch.go index 76d92b707..3bdbb4880 100644 --- a/business/scheduler/defsch/defsch.go +++ b/business/scheduler/defsch/defsch.go @@ -219,7 +219,7 @@ func (s *DefScheduler) cancelOtherWaybills(savedOrderInfo *WatchOrderInfo, bill globals.SugarLogger.Debugf("cancelOtherWaybills, order:%v, bill:%v", savedOrderInfo.order, bill) for _, v := range savedOrderInfo.waybills { if bill == nil || (v.WaybillVendorID != bill.OrderVendorID && !(v.WaybillVendorID == bill.WaybillVendorID && v.VendorWaybillID == bill.VendorWaybillID)) { - globals.SugarLogger.Debugf("cancelOtherWaybills, cancel bill:%v", bill) + globals.SugarLogger.Debugf("cancelOtherWaybills, cancel bill:%v", v) _ = s.GetDeliveryPlatformFromVendorID(v.WaybillVendorID).CancelWaybill(v) } } diff --git a/legacy/tasks/configrefresh.go b/legacy/tasks/configrefresh.go index 4e7e1b5a9..f8d2b313b 100644 --- a/legacy/tasks/configrefresh.go +++ b/legacy/tasks/configrefresh.go @@ -1,6 +1,7 @@ package tasks import ( + "fmt" "time" "git.rosy.net.cn/jx-callback/globals/api" @@ -29,60 +30,70 @@ type ElmTokenForCompatible struct { Success bool `json:"success"` } -func RefreshConfig(configKey string, expiresTime time.Duration, configGetter func() string, configSetter func(value string)) { - go func() { - sleepGap := expiresTime / 10 - needRefreshGap := expiresTime * 8 / 10 - if sleepGap > maxRefreshGap { - sleepGap = maxRefreshGap +func RefreshConfig(configKey string, expiresTime time.Duration, configGetter func() string, configSetter func(value string)) error { + sleepGap := expiresTime / 10 + needRefreshGap := expiresTime * 8 / 10 + if sleepGap > maxRefreshGap { + sleepGap = maxRefreshGap + } + refreshFunc := func() error { + curConfig := &models.Config{ + Thirdparty: configKey, } - for { - curConfig := &models.Config{ - Thirdparty: configKey, - } - - db := orm.NewOrm() - // 0: don't refresh, 1 update, 2 insert - handleType := 0 - if err := db.Read(curConfig, "Thirdparty"); err != nil { - if err != orm.ErrNoRows { - globals.SugarLogger.Errorf("db error:%v, curConfig:%v", err, curConfig) - } else { - curConfig.Token = configGetter() - handleType = 2 - } + db := orm.NewOrm() + // 0: don't refresh, 1 update, 2 insert + handleType := 0 + if err := db.Read(curConfig, "Thirdparty"); err != nil { + if err != orm.ErrNoRows { + globals.SugarLogger.Errorf("db error:%v, curConfig:%v", err, curConfig) + return err } else { - latestTimeStr := utils.Time2Str(time.Now().Add(-needRefreshGap)) - if curConfig.Date <= latestTimeStr { - curConfig.Token = configGetter() - handleType = 1 - } + curConfig.Token = configGetter() + handleType = 2 } - - if handleType != 0 { - globals.SugarLogger.Debugf("refresh %s, value:%s", configKey, curConfig.Token) - curConfig.Date = utils.GetCurTimeStr() - var num int64 - var err error - - if handleType == 1 { - num, err = db.Update(curConfig, "Token", "Date") - } else { - num, err = db.Insert(curConfig) - } - if err != nil || num == 0 { - globals.SugarLogger.Errorf("db error:%v, num:%d, curConfig:%v", err, num, curConfig) - } else { - configSetter(curConfig.Token) + } else { + latestTimeStr := utils.Time2Str(time.Now().Add(-needRefreshGap)) + if curConfig.Date <= latestTimeStr { + if curConfig.Token = configGetter(); curConfig.Token == "" { + return fmt.Errorf("can not get token for %s", configKey) } + handleType = 1 } - time.Sleep(sleepGap) } - }() + if handleType != 0 { + globals.SugarLogger.Debugf("refresh %s, value:%s", configKey, curConfig.Token) + curConfig.Date = utils.GetCurTimeStr() + var num int64 + var err error + + if handleType == 1 { + num, err = db.Update(curConfig, "Token", "Date") + } else { + num, err = db.Insert(curConfig) + } + if err != nil || num == 0 { + globals.SugarLogger.Errorf("db error:%v, num:%d, curConfig:%v", err, num, curConfig) + return err + } else { + configSetter(curConfig.Token) + } + } + return nil + } + err := refreshFunc() // 这样写的目的是强制第一次调用时要刷新一次 + if err == nil { + go func() { + for { + time.Sleep(sleepGap) + refreshFunc() + } + }() + } + return err } -func RefreshWeixinToken() { - RefreshConfig("wechat", weixinTokenExpires, func() string { +func RefreshWeixinToken() error { + return RefreshConfig("wechat", weixinTokenExpires, func() string { if tokenInfo, err := api.WeixinAPI.RefreshToken(); err == nil { return tokenInfo.AccessToken } @@ -93,8 +104,8 @@ func RefreshWeixinToken() { }) } -func RefreshElmToken() { - RefreshConfig("eleme", elmTokenExpires, func() string { +func RefreshElmToken() error { + return RefreshConfig("eleme", elmTokenExpires, func() string { if tokenInfo, err := api.ElmAPI.RefreshTokenIndividual(); err == nil { tokenInfo2 := &ElmTokenForCompatible{ Error: "", diff --git a/main.go b/main.go index 77749e531..b45dbff17 100644 --- a/main.go +++ b/main.go @@ -2,6 +2,7 @@ package main import ( bzcon "git.rosy.net.cn/jx-callback/business/controller" + "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/legacy/jd/controller" "git.rosy.net.cn/jx-callback/legacy/tasks" _ "git.rosy.net.cn/jx-callback/routers" @@ -10,9 +11,15 @@ import ( func main() { if beego.BConfig.RunMode == "prod" { + if err := tasks.RefreshWeixinToken(); err != nil { + globals.SugarLogger.Errorf("RefreshWeixinToken failed with error:%s", err) + return + } + if err := tasks.RefreshElmToken(); err != nil { + globals.SugarLogger.Errorf("RefreshElmToken failed with error:%s", err) + return + } controller.InitOrder() - tasks.RefreshWeixinToken() - tasks.RefreshElmToken() } bzcon.OrderManager.LoadPendingOrders() bzcon.WaybillManager.LoadPendingWaybills()