support NackRedeliveryDelay

This commit is contained in:
finley
2025-01-19 08:08:41 +08:00
parent 04a15cbd8d
commit 828cdbe6ff
4 changed files with 30 additions and 3 deletions

View File

@@ -43,7 +43,8 @@ type DelayQueue struct {
// for batch consume
consumeBuffer chan string
eventListener EventListener
eventListener EventListener
nackRedeliveryDelay time.Duration
}
// NilErr represents redis nil
@@ -205,6 +206,13 @@ func (q *DelayQueue) WithDefaultRetryCount(count uint) *DelayQueue {
return q
}
// WithNackRedeliveryDelay customizes the interval between redelivery and nack (callback returns false)
// If consumption exceeded deadline, the message will be redelivered immediately
func (q *DelayQueue) WithNackRedeliveryDelay(d time.Duration) *DelayQueue {
q.nackRedeliveryDelay = d
return q
}
func (q *DelayQueue) genMsgKey(idStr string) string {
if q.useHashTag {
return "{dp:" + q.name + "}" + ":msg:" + idStr
@@ -427,7 +435,7 @@ func (q *DelayQueue) nack(idStr string) error {
atomic.AddInt32(&q.fetchCount, -1)
// update retry time as now, unack2Retry will move it to retry immediately
err := q.redisCli.ZAdd(q.unAckKey, map[string]float64{
idStr: float64(time.Now().Unix()),
idStr: float64(time.Now().Add(q.nackRedeliveryDelay).Unix()),
})
if err != nil {
return fmt.Errorf("negative ack failed: %v", err)