|
- package kafkaclient
-
- import (
- "context"
- "encoding/json"
- "fmt"
- "log/slog"
- "sync"
-
- "github.com/segmentio/kafka-go"
- )
-
- func Consume[T any](r *kafka.Reader, ch chan<- T, ctx context.Context, wg *sync.WaitGroup) {
- defer wg.Done()
- for {
- select {
- case <-ctx.Done():
- msg := "consumer closed"
- slog.Info(msg)
- return
- default:
- msg, err := r.ReadMessage(ctx)
- if err != nil {
- msg := fmt.Sprintf("error reading message: %v", err)
- slog.Error(msg)
- continue
- }
-
- var data T
- if err := json.Unmarshal(msg.Value, &data); err != nil {
- msg := fmt.Sprintf("error decoding: %v", err)
- slog.Error(msg)
- continue
- }
-
- ch <- data
- }
- }
- }
|