您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 

40 行
673 B

  1. package kafkaclient
  2. import (
  3. "context"
  4. "encoding/json"
  5. "fmt"
  6. "log/slog"
  7. "sync"
  8. "github.com/segmentio/kafka-go"
  9. )
  10. func Consume[T any](r *kafka.Reader, ch chan<- T, ctx context.Context, wg *sync.WaitGroup) {
  11. defer wg.Done()
  12. for {
  13. select {
  14. case <-ctx.Done():
  15. msg := "consumer closed"
  16. slog.Info(msg)
  17. return
  18. default:
  19. msg, err := r.ReadMessage(ctx)
  20. if err != nil {
  21. msg := fmt.Sprintf("error reading message: %v", err)
  22. slog.Error(msg)
  23. continue
  24. }
  25. var data T
  26. if err := json.Unmarshal(msg.Value, &data); err != nil {
  27. msg := fmt.Sprintf("error decoding: %v", err)
  28. slog.Error(msg)
  29. continue
  30. }
  31. ch <- data
  32. }
  33. }
  34. }