gosqs: персистить перенос в DLQ (SaveMessage в DLQ + DeleteMessagePersist исходной)
This commit is contained in:
+13
-3
@@ -405,7 +405,17 @@ func (q *Queue) ClearInFlight(i int, receiptHandle string) {
|
||||
// этого retry-счётчик и DLQ-перенос могли расходиться.
|
||||
// Вызывать под write-блокировкой q. Перенос в DLQ выполняется под её блокировкой.
|
||||
// Возвращает: msgUuid, movedToDLQ.
|
||||
func (q *Queue) ResetVisibilityAndTryDLQ(i int, receiptHandle string) (msgUuid string, movedToDLQ bool) {
|
||||
// ResetVisibilityAndTryDLQ — сбрасывает видимость сообщения по индексу и, если
|
||||
// исчерпан MaxReceiveCount, переносит его в DLQ. При переносе удаляет сообщение
|
||||
// из исходной очереди (tombstone).
|
||||
//
|
||||
// Единый путь для одиночной и батчевой ChangeMessageVisibility: раньше логика
|
||||
// DLQ была только в одиночной версии, а батч лишь инкрементировал Retry — из-за
|
||||
// этого retry-счётчик и DLQ-перенос могли расходиться.
|
||||
// Вызывать под write-блокировкой q. Перенос в DLQ выполняется под её блокировкой.
|
||||
// Возвращает: msgUuid, movedToDLQ, dlqMsg (копия перенесённого сообщения, чтобы
|
||||
// вызывающий мог персистить его в DLQ; nil если переноса не было).
|
||||
func (q *Queue) ResetVisibilityAndTryDLQ(i int, receiptHandle string) (msgUuid string, movedToDLQ bool, dlqMsg *SqsMessage) {
|
||||
q.ensureIndexes()
|
||||
q.ClearInFlight(i, receiptHandle)
|
||||
msg := &q.Messages[i]
|
||||
@@ -420,9 +430,9 @@ func (q *Queue) ResetVisibilityAndTryDLQ(i int, receiptHandle string) (msgUuid s
|
||||
q.DeadLetterQueue.AppendMessage(dlqMsg)
|
||||
q.DeadLetterQueue.UnlockMu()
|
||||
q.RemoveIndex(i)
|
||||
return msgUuid, true
|
||||
return msgUuid, true, &dlqMsg
|
||||
}
|
||||
return msgUuid, false
|
||||
return msgUuid, false, nil
|
||||
}
|
||||
|
||||
// InFlightIndexes — снимок индексов in-flight сообщений (для visibility-тика).
|
||||
|
||||
Reference in New Issue
Block a user