reconnect timer + fixes

This commit is contained in:
nquidox 2026-02-21 15:03:43 +03:00
parent 13ee3230e3
commit 42646a6a08
3 changed files with 71 additions and 21 deletions

View file

@ -5,21 +5,20 @@ import (
amqp "github.com/rabbitmq/amqp091-go"
"golang.org/x/time/rate"
"log"
"time"
)
type Consumer interface {
Start() chan []byte
Start(ctx context.Context, chanLen uint) chan []byte
}
type consumeHandler struct {
ctx context.Context
client *Client
chanLen int
client *Client
}
func (c *consumeHandler) Start() chan []byte {
msgCh := make(chan []byte, c.chanLen)
go runConsumer(c.ctx, c.client, msgCh)
func (c *consumeHandler) Start(ctx context.Context, chanLen uint) chan []byte {
msgCh := make(chan []byte, chanLen)
go runConsumer(ctx, c.client, msgCh)
return msgCh
}
@ -39,8 +38,20 @@ func runConsumer(ctx context.Context, client *Client, msgCh chan []byte) {
chClosedCh := make(chan *amqp.Error, 1)
client.Channel.NotifyClose(chClosedCh)
reconnectTimer := time.NewTimer(0)
defer reconnectTimer.Stop()
<-reconnectTimer.C
for {
if !reconnectTimer.Stop() {
select {
case <-reconnectTimer.C:
default:
}
}
select {
case <-runCtx.Done():
err = client.Close()
if err != nil {
@ -49,25 +60,49 @@ func runConsumer(ctx context.Context, client *Client, msgCh chan []byte) {
return
case amqErr := <-chClosedCh:
log.Printf("AMQP Channel closed due to: %s\n", amqErr)
log.Printf("AMQP Channel closed due to: %s Reconnecting...\n", amqErr)
reconnectTimer.Reset(time.Second)
case <-reconnectTimer.C:
deliveries, err = client.consume()
if err != nil {
log.Println("Error trying to consume, will try again")
log.Println("Error trying to consume, will try again. Retry in 5 seconds.")
reconnectTimer.Reset(time.Second * 5)
continue
}
chClosedCh = make(chan *amqp.Error, 1)
client.Channel.NotifyClose(chClosedCh)
case delivery := <-deliveries:
msgCh <- delivery.Body
log.Printf("Received message: %s\n", delivery.Body)
if err = delivery.Ack(false); err != nil {
log.Printf("Error acknowledging message: %s\n", err)
case delivery, ok := <-deliveries:
if !ok {
log.Println("Deliveries channel closed unexpectedly")
reconnectTimer.Reset(time.Second)
continue
}
if err = limiter.Wait(runCtx); err != nil {
log.Printf("Wait limiter failed: %s\n", err)
}
select {
case <-runCtx.Done():
if err = delivery.Nack(false, true); err != nil {
log.Printf("Error nacking message: %s\n", err)
}
err = client.Close()
if err != nil {
log.Printf("Close failed: %s\n", err)
}
return
case msgCh <- delivery.Body:
log.Printf("Received message: %s\n", delivery.Body)
if err = delivery.Ack(false); err != nil {
log.Printf("Error acknowledging message: %s\n", err)
}
}
limiter.Wait(runCtx)
}
}
}