From d5750cdbc4b3db0c29c2c9b211cc38a7d85a44cd Mon Sep 17 00:00:00 2001 From: Hugo Wetterberg Date: Mon, 20 Nov 2023 12:41:01 +0100 Subject: [PATCH] return an error instead of crashing when we cannot retry --- consume.go | 41 ++++++++++++++++++++--------------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/consume.go b/consume.go index d1f802f..6e1ed86 100644 --- a/consume.go +++ b/consume.go @@ -44,12 +44,9 @@ type Delivery struct { amqp.Delivery } -// NewConsumer returns a new Consumer connected to the given rabbitmq server -// it also starts consuming on the given connection with automatic reconnection handling -// Do not reuse the returned consumer for anything other than to close it +// NewConsumer returns a new Consumer connected to the given rabbitmq server. func NewConsumer( conn *Conn, - handler Handler, queue string, optionFuncs ...func(*ConsumerOptions), ) (*Consumer, error) { @@ -78,30 +75,32 @@ func NewConsumer( isClosed: false, } - err = consumer.startGoroutines( + return consumer, nil +} + +// Run starts consuming with automatic reconnection handling. Do not reuse the +// consumer for anything other than to close it. +func (consumer *Consumer) Run(handler Handler) error { + err := consumer.startGoroutines( handler, - *options, + consumer.options, ) if err != nil { - return nil, err + return err } - go func() { - for err := range consumer.reconnectErrCh { - consumer.options.Logger.Infof("successful consumer recovery from: %v", err) - err = consumer.startGoroutines( - handler, - *options, - ) - if err != nil { - consumer.options.Logger.Fatalf("error restarting consumer goroutines after cancel or close: %v", err) - consumer.options.Logger.Fatalf("consumer closing, unable to recover") - return - } + for err := range consumer.reconnectErrCh { + consumer.options.Logger.Infof("successful consumer recovery from: %v", err) + err = consumer.startGoroutines( + handler, + consumer.options, + ) + if err != nil { + return fmt.Errorf("error restarting consumer goroutines after cancel or close: %w", err) } - }() + } - return consumer, nil + return nil } // Close cleans up resources and closes the consumer.