tasker.go 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. // Copyright 2019 getensh.com. All rights reserved.
  2. // Use of this source code is governed by getensh.com.
  3. package httptasker
  4. import (
  5. "fmt"
  6. "net/http"
  7. "time"
  8. "github.com/gin-gonic/gin"
  9. "git.getensh.com/common/gopkgsv2/tasker"
  10. "go.uber.org/zap"
  11. "google.golang.org/grpc/codes"
  12. "google.golang.org/grpc/status"
  13. )
  14. // Error 出错时数据结构
  15. type Error struct {
  16. Code codes.Code `json:"code"`
  17. Message string `json:"message"`
  18. }
  19. // Task 任务函数
  20. type Task func() error
  21. // Exec 执行任务
  22. func Exec(ctx *gin.Context, tasks ...Task) (err error) {
  23. // 进程中断中,不再处理任务
  24. if tasker.Interrupted() {
  25. return tasker.InterruptError
  26. }
  27. // 开始时间
  28. startTime := uint64(time.Now().UnixNano())
  29. // 抓异常代码
  30. defer func() {
  31. if r := recover(); r != nil {
  32. if e, ok := r.(error); ok {
  33. err = e
  34. } else {
  35. err = fmt.Errorf("%+v", r)
  36. }
  37. s := status.New(1, "内部服务错误")
  38. if v, ok := status.FromError(err); ok {
  39. s = v
  40. }
  41. ctx.JSON(http.StatusOK, Error{Code: s.Code(), Message: s.Message()})
  42. // 打印到access.log日志中
  43. endTime := uint64(time.Now().UnixNano())
  44. tasker.LogInfo(ctx.Request.Method,
  45. zap.String("path", ctx.Request.URL.Path),
  46. zap.String("status", "failure"),
  47. zap.String("elapsed", fmt.Sprintf("%fms", float64(endTime-startTime)/1000000)),
  48. zap.String("remote_addr", ctx.Request.RemoteAddr), // 这里必须要配置nginx正确,否则内网IP
  49. zap.String("error", err.Error())) // 具体的错误消息
  50. return // 这里必须返回
  51. }
  52. // TODO 需要记录哪些信息
  53. // 打印到access.log日志中
  54. endTime := uint64(time.Now().UnixNano())
  55. tasker.LogInfo(ctx.Request.Method,
  56. zap.String("path", ctx.Request.URL.Path),
  57. zap.String("status", "success"),
  58. zap.String("elapsed", fmt.Sprintf("%fms", float64(endTime-startTime)/1000000)),
  59. zap.String("remote_addr", ctx.Request.RemoteAddr)) // 这里必须要配置nginx正确,否则内网IP
  60. }()
  61. // 按顺序执行任务
  62. for _, task := range tasks {
  63. if task != nil {
  64. if err = task(); err != nil {
  65. panic(err)
  66. }
  67. }
  68. }
  69. return
  70. }