tasker.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. // Copyright 2019 github.com. All rights reserved.
  2. // Use of this source code is governed by github.com.
  3. package rpctasker
  4. import (
  5. "context"
  6. "fmt"
  7. "go.uber.org/zap"
  8. "google.golang.org/grpc/status"
  9. "runtime"
  10. "git.getensh.com/common/gopkgs/logger"
  11. "git.getensh.com/common/gopkgs/tasker"
  12. )
  13. // 打印调用者函数名
  14. func callerName() string {
  15. pc, _, _, _ := runtime.Caller(2)
  16. return runtime.FuncForPC(pc).Name()
  17. }
  18. // Task 任务函数
  19. type Task func() error
  20. // Exec 执行任务
  21. func Exec(ctx context.Context, tasks ...Task) (err error) {
  22. // 进程中断中,不再处理任务
  23. if tasker.Interrupted() {
  24. return tasker.InterruptError
  25. }
  26. // 抓异常代码
  27. defer func() {
  28. if r := recover(); r != nil {
  29. if e, ok := r.(error); ok {
  30. err = e
  31. } else {
  32. logger.Error("err",
  33. zap.String("system_err", err.Error()),
  34. zap.Stack("stacktrace"))
  35. err = status.Error(10002, fmt.Sprint("内部服务错误:%v", r))
  36. }
  37. // 这里必须返回
  38. return
  39. }
  40. }()
  41. // 按顺序执行任务
  42. for _, task := range tasks {
  43. if task != nil {
  44. if err = task(); err != nil {
  45. panic(err)
  46. }
  47. }
  48. }
  49. return
  50. }