@@ -120,7 +120,7 @@ func run() error { //nolint:gocognit,gocyclo // linear service wiring / DI setup
120120 }
121121
122122 // Setup RabbitMQ (optional - graceful degradation for publisher)
123- rmqAdapter , costJobPub , closeRabbitMQ := setupRabbitMQ (cfg )
123+ rmqAdapter , costJobPub , closeRabbitMQ := setupRabbitMQ (ctx , cfg )
124124 defer closeRabbitMQ ()
125125
126126 // Wrap into explicit interface values so that when RabbitMQ is unavailable
@@ -981,13 +981,27 @@ func startServers(ctx context.Context, cfg *config.Config,
981981// graceful degradation). Returns the job-publisher adapter (oracle sync / RM
982982// cost), the cost-calc job-trigger publisher (orchestrator hand-off), and a
983983// close function for graceful shutdown.
984- func setupRabbitMQ (cfg * config.Config ) (* rabbitmq.JobPublisherAdapter , * rabbitmq.CostJobPublisher , func ()) {
985- rmqConn , err := rabbitmq .NewConnection (cfg .RabbitMQ , log .Logger )
984+ func setupRabbitMQ (ctx context.Context , cfg * config.Config ) (* rabbitmq.JobPublisherAdapter , * rabbitmq.CostJobPublisher , func ()) {
985+ const connectAttempts = 3
986+
987+ rmqConn , err := rabbitmq .NewConnectionWithRetry (cfg .RabbitMQ , log .Logger , connectAttempts )
986988 if err != nil {
987- log .Warn ().Err (err ).Msg ("Failed to connect to RabbitMQ, sync trigger will fail" )
989+ log .Warn ().
990+ Err (err ).
991+ Str ("url" , rabbitmq .SanitizeURL (cfg .RabbitMQ .URL )).
992+ Int ("attempts" , connectAttempts ).
993+ Msg ("Failed to connect to RabbitMQ after all attempts; the service will still start, " +
994+ "but RM cost recalculate/export, cost sheet export, oracle sync trigger and " +
995+ "multi-product calc scopes will fail until RabbitMQ is reachable and finance is restarted" )
988996 return nil , nil , func () {}
989997 }
990998
999+ // Supervise redials on connection loss and swaps the live channel in place,
1000+ // so publishers recover mid-life instead of staying broken for the pod's
1001+ // whole lifetime. Bound to the root ctx: cancelled on shutdown.
1002+ superviseCtx , stopSupervisor := context .WithCancel (ctx )
1003+ go rmqConn .Supervise (superviseCtx )
1004+
9911005 publisher := rabbitmq .NewPublisher (rmqConn , log .Logger )
9921006 adapter := rabbitmq .NewJobPublisherAdapter (publisher , log .Logger )
9931007
@@ -998,6 +1012,7 @@ func setupRabbitMQ(cfg *config.Config) (*rabbitmq.JobPublisherAdapter, *rabbitmq
9981012 }
9991013
10001014 closeFunc := func () {
1015+ stopSupervisor ()
10011016 if closeErr := rmqConn .Close (); closeErr != nil {
10021017 log .Warn ().Err (closeErr ).Msg ("Failed to close RabbitMQ connection" )
10031018 }
0 commit comments