- AfterFuncWithRecover

This commit is contained in:
gazebo
2019-03-15 10:19:02 +08:00
parent 319866fe63
commit 0b9e42161b
2 changed files with 20 additions and 7 deletions

View File

@@ -4,6 +4,8 @@ import (
"fmt"
"testing"
"time"
"git.rosy.net.cn/baseapi/utils"
)
func TestLimitSpeed(t *testing.T) {
@@ -21,29 +23,29 @@ func TestLimitSpeed(t *testing.T) {
TimeGapMilliSecond: 2000,
})
go func() {
utils.CallFuncAsync(func() {
count := 0
for {
limiter.AccessAPI("limited1persecond")
fmt.Printf("limited1persecond, time:%s, count:%d\n", time.Now().Format("2006-01-02 15:04:05.00000"), count)
count++
}
}()
go func() {
})
utils.CallFuncAsync(func() {
count := 0
for {
limiter.AccessAPI("limited10per10second")
fmt.Printf("limited10per10second, time:%s, count:%d\n", time.Now().Format("2006-01-02 15:04:05.00000"), count)
count++
}
}()
go func() {
})
utils.CallFuncAsync(func() {
count := 0
for {
limiter.AccessAPI("otherAPI")
fmt.Printf("otherAPI, time:%s, count:%d\n", time.Now().Format("2006-01-02 15:04:05.00000"), count)
count++
}
}()
})
time.Sleep(30 * time.Second)
}

View File

@@ -155,10 +155,21 @@ func CallFuncAsync(funcToCall func()) {
}()
}
func AfterFuncWithRecover(duration time.Duration, funcToCall func()) *time.Timer {
return time.AfterFunc(duration, func() {
defer func() {
if r := recover(); r != nil {
baseapi.SugarLogger.Errorf("error when calling func:%v, r:%v", funcToCall, r)
}
}()
funcToCall()
})
}
func CallFuncRetryAsync(handler func(int) error, duration time.Duration, retryCount int) (err error) {
err = handler(retryCount)
if err != nil && retryCount > 0 {
time.AfterFunc(duration, func() {
AfterFuncWithRecover(duration, func() {
CallFuncRetryAsync(handler, duration, retryCount-1)
})
}