diff --git a/business/jxutils/eventhub/eventhub.go b/business/jxutils/eventhub/eventhub.go index 6beacfa71..4b3e02991 100644 --- a/business/jxutils/eventhub/eventhub.go +++ b/business/jxutils/eventhub/eventhub.go @@ -33,7 +33,6 @@ const ( ) type IEventProducer interface { - GetEvent(eventTypeList []string, criteria interface{}) (event *EventInfo, err error) IsCriteriaMatch(eventInfo *EventInfo, criteria interface{}) bool } @@ -212,36 +211,29 @@ func (e *EventHub) PostNewEvent(eventCategory string, event *EventInfo) { } func (e *EventHub) GetEvent(eventCategory string, eventTypeList []string, criteria interface{}, waitTime time.Duration) (event *EventInfo, err error) { - eventProducer := e.getEventProducer(eventCategory) - if eventProducer == nil { - return nil, fmt.Errorf("eventCategory:%s没有注册", eventCategory) - } - event, err = eventProducer.GetEvent(eventTypeList, criteria) - if err == nil && event == nil { - notifyChan := e.registerConsumer(eventCategory, eventTypeList, criteria) - pollingDuration := defPollingDuration - if waitTime != 0 { - pollingDuration = waitTime - if globals.IsProductEnv() { - if pollingDuration > maxPollingDuration { - pollingDuration = maxPollingDuration - } else if pollingDuration < minPollingDuration { - pollingDuration = minPollingDuration - } + notifyChan := e.registerConsumer(eventCategory, eventTypeList, criteria) + pollingDuration := defPollingDuration + if waitTime != 0 { + pollingDuration = waitTime + if globals.IsProductEnv() { + if pollingDuration > maxPollingDuration { + pollingDuration = maxPollingDuration + } else if pollingDuration < minPollingDuration { + pollingDuration = minPollingDuration } } - timer := time.NewTimer(pollingDuration) - select { - case tmpEvent, ok := <-notifyChan: - timer.Stop() - if ok { - event = tmpEvent - } - case <-timer.C: - e.unregisterConsumer(notifyChan) - } - close(notifyChan) } + timer := time.NewTimer(pollingDuration) + select { + case tmpEvent, ok := <-notifyChan: + timer.Stop() + if ok { + event = tmpEvent + } + case <-timer.C: + e.unregisterConsumer(notifyChan) + } + close(notifyChan) return event, err } diff --git a/business/jxutils/eventhub/syseventhub/syseventhub.go b/business/jxutils/eventhub/syseventhub/syseventhub.go index 784092f54..baedfe79a 100644 --- a/business/jxutils/eventhub/syseventhub/syseventhub.go +++ b/business/jxutils/eventhub/syseventhub/syseventhub.go @@ -20,6 +20,11 @@ type Hub struct { type Criteria struct { } +type WXTokenInfo struct { + IsNew bool `json:"isNew"` + Token string `json:"token"` +} + var ( SysEventHub *Hub ) @@ -36,31 +41,6 @@ func New() (hub *Hub) { return hub } -func (h *Hub) GetEvent(eventTypeList []string, criteria interface{}) (event *eventhub.EventInfo, err error) { - for _, eventType := range eventTypeList { - switch eventType { - case EventTypeWXToken: - return h.getWXToken(criteria) - } - } - return event, err -} - -func (h *Hub) getWXToken(criteria interface{}) (event *eventhub.EventInfo, err error) { - criteriaToken := "" - if criteria != nil { - criteriaToken = criteria.(string) - } - token := api.WeixinAPI.CBGetToken() - if token != criteriaToken { - return &eventhub.EventInfo{ - Type: EventTypeWXToken, - Data: token, - }, nil - } - return nil, nil -} - func (h *Hub) IsCriteriaMatch(eventInfo *eventhub.EventInfo, criteria interface{}) bool { return true } @@ -72,10 +52,21 @@ func (h *Hub) OnNewWXToken(token string) { }) } -func (h *Hub) GetWXToken(oldToken string, waitTime time.Duration) (token string) { - eventInfo, err := h.eventHub.GetEvent(EventCategory, []string{EventTypeWXToken}, oldToken, waitTime) - if err == nil && eventInfo != nil { - token = eventInfo.Data.(string) +func (h *Hub) GetWXToken(oldToken string, waitTime time.Duration) (tokenInfo *WXTokenInfo) { + token := api.WeixinAPI.CBGetToken() + if token != oldToken { + tokenInfo = &WXTokenInfo{ + IsNew: false, + Token: token, + } + } else { + eventInfo, err := h.eventHub.GetEvent(EventCategory, []string{EventTypeWXToken}, nil, waitTime) + if err == nil && eventInfo != nil { + tokenInfo = &WXTokenInfo{ + IsNew: true, + Token: eventInfo.Data.(string), + } + } } - return token + return tokenInfo } diff --git a/business/jxutils/tasks/configrefresh.go b/business/jxutils/tasks/configrefresh.go index 120a1316d..ada99e360 100644 --- a/business/jxutils/tasks/configrefresh.go +++ b/business/jxutils/tasks/configrefresh.go @@ -4,7 +4,6 @@ import ( "fmt" "io/ioutil" "net/http" - "strings" "time" "git.rosy.net.cn/baseapi/platformapi" @@ -132,10 +131,14 @@ func RefreshWeixinToken() (err error) { globals.SugarLogger.Errorf("RefreshWeixinToken RefreshToken failed with error:%v", err) } } else { - token = getWXTokenFromProd(api.WeixinAPI.CBGetToken()) + tokenInfo := getWXTokenFromProd(api.WeixinAPI.CBGetToken()) + if !tokenInfo.IsNew { + expireTimeStr = utils.Time2Str(time.Now().Add(-weixinTokenExpires)) + } + token = tokenInfo.Token } } - return token, "" + return token, expireTimeStr }, func(value string) { syseventhub.SysEventHub.OnNewWXToken(value) api.WeixinAPI.CBSetToken(value) @@ -242,8 +245,7 @@ func RefreshYilianyunToken() (err error) { }) } -func getWXTokenFromProd(oldToken string) (token string) { - token = oldToken +func getWXTokenFromProd(oldToken string) (tokenInfo *syseventhub.WXTokenInfo) { if globals.GetWeixinTokenKey != "" && globals.GetWeixinTokenURL != "" { for { waitSecond := 5 * 60 @@ -256,8 +258,11 @@ func getWXTokenFromProd(oldToken string) (token string) { var result CallResult if err = utils.UnmarshalUseNumber(data, &result); err == nil { if result.Code == "0" { - token = strings.Replace(result.Data, "\"", "", -1) - break + if result.Data != "" { + if err = utils.UnmarshalUseNumber(data, &tokenInfo); err == nil && tokenInfo != nil { + break + } + } } else { err = fmt.Errorf("return code is:%s", result.Code) } @@ -273,5 +278,5 @@ func getWXTokenFromProd(oldToken string) (token string) { } } } - return token + return tokenInfo }