package vstp import ( "time" "git.fjla.uk/owlboard/timetable-mgr/log" "git.fjla.uk/owlboard/timetable-mgr/messaging" "github.com/go-stomp/stomp/v3" "go.uber.org/zap" ) func Subscribe() { var sub *stomp.Subscription var err error retryCount := 0 maxRetries := 5 for retryCount < maxRetries { sub, err = messaging.Client.Subscribe("/topic/VSTP_ALL", stomp.AckAuto) if err != nil { log.Warn("Unable to start subscription", zap.Error(err)) time.Sleep(10 * time.Second) retryCount++ continue } break } if sub == nil { log.Fatal("Failed to subscribe to VSTP topic", zap.Int("attempts", maxRetries)) } log.Info("Subscription to VSTP topic successful, listening") go func() { for { func() { defer func() { if r := recover(); r != nil { log.Warn("VSTP Message Handler Stopped, waiting for recovery") time.Sleep(time.Second * 10) } }() log.Info("VSTP Message handler started") for { msg := <-sub.C if msg.Err != nil { log.Error("VSTP Message Error", zap.Error(msg.Err)) } else { if msg != nil { log.Info("VSTP Message Received") handle(msg) } else { log.Info("VSTP Message Empty") } } } }() } }() select {} }