client.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. package httppm
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/gorilla/websocket"
  6. "net/http"
  7. "os"
  8. "strconv"
  9. "time"
  10. )
  11. type HPMClientLogFunc func(msg string)
  12. type HPMClient struct {
  13. hpmURL string
  14. checkAliveDuration time.Duration
  15. running bool
  16. closeCncl context.CancelFunc
  17. logFunc HPMClientLogFunc
  18. }
  19. func NewHPMClient(hpmURL string, checkAliveDuration time.Duration) *HPMClient {
  20. c := &HPMClient{
  21. hpmURL: hpmURL,
  22. checkAliveDuration: checkAliveDuration,
  23. running: false,
  24. logFunc: func(msg string) {},
  25. }
  26. return c
  27. }
  28. func (c *HPMClient) SetLogFunc(fn HPMClientLogFunc) {
  29. c.logFunc = fn
  30. }
  31. func (c *HPMClient) Run() error {
  32. pid := os.Getpid()
  33. hdr := http.Header{}
  34. hdr.Add("pid", strconv.Itoa(pid))
  35. wsconn, _, err := websocket.DefaultDialer.Dial(c.hpmURL, hdr)
  36. if err != nil {
  37. return fmt.Errorf("HPM Client WS Dial Error: %v", err)
  38. }
  39. c.logFunc("hpm client websocket connected.")
  40. hbTimer := time.NewTicker(c.checkAliveDuration)
  41. ctx, cncl := context.WithCancel(context.Background())
  42. c.closeCncl = cncl
  43. c.running = true
  44. defer hbTimer.Stop()
  45. go func() {
  46. for {
  47. _, _, rerr := wsconn.ReadMessage()
  48. if rerr != nil {
  49. c.logFunc(fmt.Sprint("hpm stop by ws recv fail, detail: ", rerr))
  50. _ = wsconn.Close()
  51. cncl()
  52. return
  53. }
  54. }
  55. }()
  56. MLoop:
  57. for {
  58. select {
  59. case <-hbTimer.C:
  60. xerr := wsconn.WriteMessage(websocket.PingMessage, nil)
  61. if xerr != nil {
  62. c.logFunc(fmt.Sprint("hpm stop by ws send fail, detail: ", xerr))
  63. cncl()
  64. continue MLoop
  65. }
  66. case <-ctx.Done():
  67. {
  68. c.logFunc("hpm stopped.")
  69. return nil
  70. }
  71. }
  72. }
  73. return nil
  74. }
  75. func (c *HPMClient) Stop(xerr error) {
  76. if c.running {
  77. c.logFunc("hpm stop by other.")
  78. c.closeCncl()
  79. }
  80. }