chroma.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package models
  2. import (
  3. "context"
  4. "fmt"
  5. "io"
  6. "net/http"
  7. "time"
  8. "github.com/beego/beego/v2/server/web"
  9. )
  10. // HeartbeatTask 心跳任务结构体
  11. type HeartbeatTask struct {
  12. URL string
  13. Interval time.Duration
  14. HTTPClient *http.Client
  15. ctx context.Context
  16. cancel context.CancelFunc
  17. }
  18. // NewHeartbeatTask 创建新的心跳任务
  19. func NewHeartbeatTask(url string, interval time.Duration) *HeartbeatTask {
  20. ctx, cancel := context.WithCancel(context.Background())
  21. return &HeartbeatTask{
  22. URL: url,
  23. Interval: interval,
  24. HTTPClient: &http.Client{Timeout: 30 * time.Second},
  25. ctx: ctx,
  26. cancel: cancel,
  27. }
  28. }
  29. // Start 启动心跳任务
  30. func (h *HeartbeatTask) Start() {
  31. go h.run()
  32. }
  33. // Stop 停止心跳任务
  34. func (h *HeartbeatTask) Stop() {
  35. h.cancel()
  36. }
  37. // run 运行心跳任务
  38. func (h *HeartbeatTask) run() {
  39. ticker := time.NewTicker(h.Interval)
  40. defer ticker.Stop()
  41. // 立即执行一次
  42. h.sendHeartbeat()
  43. for {
  44. select {
  45. case <-h.ctx.Done():
  46. fmt.Println("心跳任务已停止")
  47. return
  48. case <-ticker.C:
  49. h.sendHeartbeat()
  50. }
  51. }
  52. }
  53. // sendHeartbeat 发送心跳请求
  54. func (h *HeartbeatTask) sendHeartbeat() {
  55. req, err := http.NewRequestWithContext(h.ctx, "GET", h.URL, nil)
  56. if err != nil {
  57. fmt.Printf("创建心跳请求失败: %v\n", err)
  58. return
  59. }
  60. resp, err := h.HTTPClient.Do(req)
  61. if err != nil {
  62. fmt.Printf("心跳请求失败: %v\n", err)
  63. return
  64. }
  65. defer resp.Body.Close()
  66. body, err := io.ReadAll(resp.Body)
  67. if err != nil {
  68. fmt.Printf("读取心跳响应失败: %v\n", err)
  69. return
  70. }
  71. if resp.StatusCode == http.StatusOK {
  72. fmt.Printf("心跳成功 [%s] - 状态码: %d, 响应: %s\n",
  73. time.Now().Format("2006-01-02 15:04:05"), resp.StatusCode, string(body))
  74. } else {
  75. fmt.Printf("心跳失败 [%s] - 状态码: %d, 响应: %s\n",
  76. time.Now().Format("2006-01-02 15:04:05"), resp.StatusCode, string(body))
  77. }
  78. }
  79. // StartHeartbeatTask 启动心跳任务(从配置中读取URL)
  80. func StartHeartbeatTask() {
  81. // 从配置文件中读取心跳API URL
  82. heartbeatURL, err := web.AppConfig.String("heartbeat_api_url")
  83. if err != nil || heartbeatURL == "" {
  84. fmt.Println("未配置心跳API URL,跳过心跳任务")
  85. return
  86. }
  87. // 创建心跳任务,每10分钟执行一次
  88. heartbeatTask := NewHeartbeatTask(heartbeatURL, 10*time.Minute)
  89. fmt.Printf("启动心跳任务,目标URL: %s,间隔: 10分钟\n", heartbeatURL)
  90. heartbeatTask.Start()
  91. }