@@ -17,6 +17,10 @@ const (
1717 mqConsumerConcurrency = 1
1818)
1919
20+ const (
21+ consumerRetries = 10
22+ )
23+
2024// MQService
2125type MQService struct {
2226 logger hclog.Logger
@@ -61,6 +65,21 @@ func newMQService(logger hclog.Logger, config *MQConfig, datafeedService *DataFe
6165 return mq , nil
6266}
6367
68+ func (mq * MQService ) restartWithRetries (ctx context.Context ) (<- chan * proto.DataFeedReport , <- chan error , error ) {
69+ for i := 0 ; i < consumerRetries ; i ++ {
70+ mq .logger .Debug ("Restarting consumer with try" , i )
71+ time .Sleep (5 * time .Second )
72+ reports , errors , err := mq .startConsumer (ctx , mqConsumerConcurrency )
73+ if err == nil {
74+ return reports , errors , err
75+ }
76+ }
77+
78+ erroMsg := fmt .Sprintf ("failed to restart consumer after %d retries" , consumerRetries )
79+ mq .logger .Error (erroMsg )
80+ return nil , nil , fmt .Errorf (erroMsg )
81+ }
82+
6483// startConsumeLoop
6584func (mq * MQService ) startConsumeLoop () {
6685 mq .logger .Debug ("listening for MQ messages..." )
@@ -80,20 +99,10 @@ func (mq *MQService) startConsumeLoop() {
8099 mq .datafeedService .queueReportingTx (ProposeOutcome , report .MarketHash , report .Outcome )
81100 case err = <- errors :
82101 mq .logger .Error ("error while consuming from message queue" , "err" , err )
83- mq .logger .Debug ("Restarting consumer..." )
84- time .Sleep (2 * time .Second )
85- reports , errors , err = mq .startConsumer (ctx , mqConsumerConcurrency )
86- if err != nil {
87- mq .logger .Error ("Got Error during consumer restart" , err )
88- }
102+ reports , errors , _ = mq .restartWithRetries (ctx )
89103 case <- common .GetTerminationSignalCh ():
90104 mq .logger .Debug ("got sigterm, shuttown down mq consumer" )
91- mq .logger .Debug ("Restarting consumer..." )
92- time .Sleep (2 * time .Second )
93- reports , errors , err = mq .startConsumer (ctx , mqConsumerConcurrency )
94- if err != nil {
95- mq .logger .Error ("Got Error during consumer restart" , err )
96- }
105+ reports , errors , _ = mq .restartWithRetries (ctx )
97106
98107 }
99108 }
@@ -175,6 +184,14 @@ func (mq *MQService) startConsumer(
175184 }()
176185 }
177186
187+ go func () {
188+ notifyCloseError := <- mq .connection .Channel .NotifyClose (make (chan * amqp.Error ))
189+ if notifyCloseError != nil {
190+ mq .logger .Debug ("Got notifyCloseError error" )
191+ errors <- fmt .Errorf ("Connection closed: %v" , notifyCloseError )
192+ }
193+ }()
194+
178195 // stop the consumer upon sigterm
179196 go func () {
180197 <- ctx .Done ()
0 commit comments