From 94484a92b75dbe1e77995eb1bce718d5e9ddefd4 Mon Sep 17 00:00:00 2001 From: gazebo Date: Sat, 27 Apr 2019 17:41:33 +0800 Subject: [PATCH] =?UTF-8?q?-=20jxgy=E5=88=B7=E6=96=B0token?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxutils/tasks/configrefresh.go | 53 ++++++++++++++----------- 1 file changed, 29 insertions(+), 24 deletions(-) diff --git a/business/jxutils/tasks/configrefresh.go b/business/jxutils/tasks/configrefresh.go index 92fb29045..4c34e4409 100644 --- a/business/jxutils/tasks/configrefresh.go +++ b/business/jxutils/tasks/configrefresh.go @@ -28,8 +28,11 @@ const ( dingdingTokenExpires = 7200 * time.Second elmTokenExpires = 20 * 24 * 3600 * time.Second weimobTokenExpires = 7200 * time.Second - maxRefreshGap = 5 * 60 * time.Second yilianyunTokenExpires = 30 * 24 * 3600 * time.Second + + maxRefreshGap = 5 * 60 * time.Second + errRefreshGap = 10 * time.Second + minRefreshGap = 1 * time.Second ) type ElmTokenForCompatible struct { @@ -49,12 +52,14 @@ type CallResult struct { } func RefreshConfig(configKey string, expiresTime time.Duration, configGetter func() (string, string), configSetter func(value string)) error { - sleepGap := expiresTime / 10 needRefreshGap := expiresTime * 8 / 10 + sleepGap := expiresTime / 10 if sleepGap > maxRefreshGap { sleepGap = maxRefreshGap } - refreshFunc := func() (string, error) { + + refreshFunc := func() (sleepDuration time.Duration) { + sleepDuration = sleepGap curConfig := &legacymodel.Config{ Thirdparty: configKey, } @@ -64,7 +69,7 @@ func RefreshConfig(configKey string, expiresTime time.Duration, configGetter fun if err := db.Read(curConfig, "Thirdparty"); err != nil { if err != orm.ErrNoRows { globals.SugarLogger.Errorf("db error:%v, curConfig:%v", err, curConfig) - return "", err + return errRefreshGap } handleType = 2 } else { @@ -77,15 +82,18 @@ func RefreshConfig(configKey string, expiresTime time.Duration, configGetter fun if curConfig.Token, curConfig.Date = configGetter(); curConfig.Token == "" { if beego.BConfig.RunMode == "prod" { globals.SugarLogger.Errorf("RefreshConfig %s get empty token", configKey) + sleepDuration = errRefreshGap } else { globals.SugarLogger.Infof("RefreshConfig %s get empty token", configKey) } - return "", nil + return sleepDuration } globals.SugarLogger.Debugf("RefreshConfig refresh %s, value:%s", configKey, curConfig.Token) - + configSetter(curConfig.Token) if curConfig.Date == "" { curConfig.Date = utils.GetCurTimeStr() + } else { + sleepDuration = expiresTime - time.Now().Sub(utils.Str2Time(curConfig.Date)) } var num int64 var err error @@ -97,25 +105,20 @@ func RefreshConfig(configKey string, expiresTime time.Duration, configGetter fun } if err != nil || num == 0 { globals.SugarLogger.Errorf("db error:%v, num:%d, curConfig:%v", err, num, curConfig) - return "", err } - configSetter(curConfig.Token) } - return curConfig.Token, nil - } - token, err := refreshFunc() // 这样写的目的是强制第一次调用时要刷新一次 - if err == nil { - if token != "" { - configSetter(token) + if sleepDuration < minRefreshGap { + sleepDuration = minRefreshGap + } else if sleepDuration > maxRefreshGap { + sleepDuration = maxRefreshGap } - utils.CallFuncAsync(func() { - for { - time.Sleep(sleepGap) - refreshFunc() - } - }) + return sleepDuration } - return err + utils.CallFuncAsync(func() { + sleepGap := refreshFunc() + time.Sleep(sleepGap) + }) + return nil } func RefreshWeixinToken() (err error) { @@ -250,7 +253,9 @@ func getWXTokenFromProd(oldToken string) (tokenInfo *syseventhub.WXTokenInfo) { if globals.GetWeixinTokenKey != "" && globals.GetWeixinTokenURL != "" { for { waitSecond := 5 * 60 + globals.SugarLogger.Debugf("getWXTokenFromProd1") response, err := http.Get(fmt.Sprintf("%s?accessKey=%s&oldToken=%s&waitSecond=%d", globals.GetWeixinTokenURL, globals.GetWeixinTokenKey, oldToken, waitSecond)) + globals.SugarLogger.Debugf("getWXTokenFromProd2 error:%v", err) if err == nil { defer response.Body.Close() if response.StatusCode == http.StatusOK { @@ -260,7 +265,7 @@ func getWXTokenFromProd(oldToken string) (tokenInfo *syseventhub.WXTokenInfo) { if err = utils.UnmarshalUseNumber(data, &result); err == nil { if result.Code == "0" { if result.Data != "" { - if err = utils.UnmarshalUseNumber(data, &tokenInfo); err == nil && tokenInfo != nil { + if err = utils.UnmarshalUseNumber([]byte(result.Data), &tokenInfo); err == nil && tokenInfo != nil { globals.SugarLogger.Debugf("getWXTokenFromProd:%s", utils.Format4Output(tokenInfo, false)) break } @@ -274,9 +279,9 @@ func getWXTokenFromProd(oldToken string) (tokenInfo *syseventhub.WXTokenInfo) { err = platformapi.ErrHTTPCodeIsNot200 } } + globals.SugarLogger.Infof("getWXTokenFromProd failed with error:%v", err) if err != nil { - globals.SugarLogger.Infof("getWXTokenFromProd failed with error:%v", err) - time.Sleep(30 * time.Second) + time.Sleep(errRefreshGap) } } }