|
@@ -42,7 +42,7 @@ type Redriver interface {
|
|
|
GetQueueItems(ctx context.Context, qName string) ([]Message, error)
|
|
|
DeleteItems(ctx context.Context, qName string, itemsIDs []ItemsKeys) error
|
|
|
Purge(ctx context.Context, qName string) error
|
|
|
- RedriveItems(ctx context.Context, qName string, itemIDs []ItemsKeys) error
|
|
|
+ RedriveItems(ctx context.Context, qName string, messages []Message) error
|
|
|
}
|
|
|
|
|
|
type redriver struct {
|
|
@@ -393,9 +393,59 @@ func (r *redriver) Purge(ctx context.Context, qName string) error {
|
|
|
return nil
|
|
|
}
|
|
|
|
|
|
-func (r *redriver) RedriveItems(ctx context.Context, qName string, itemIDs []ItemsKeys) error {
|
|
|
- // TODO implement me
|
|
|
- panic("implement me")
|
|
|
+// RedriveItems sends the selected message back to their respective source queue.
|
|
|
+//
|
|
|
+// Since a queue can act as a DLQ for more than one source queue, the messages
|
|
|
+// sends are grouped by source queue.
|
|
|
+func (r *redriver) RedriveItems(ctx context.Context, qName string, messages []Message) error {
|
|
|
+ qURLs := make(map[string][]Message, 1) // In most cases, only a single queue will be used.
|
|
|
+ for _, message := range messages {
|
|
|
+ sARN := message.Attributes.DeadLetterQueueSourceARN
|
|
|
+ sURL, err := URLFromARNString(sARN)
|
|
|
+ if err != nil {
|
|
|
+ return fmt.Errorf("failed resolving source ARN %q to URL: %v", sARN, err)
|
|
|
+ }
|
|
|
+ qURLs[sURL] = append(qURLs[sURL], message)
|
|
|
+ }
|
|
|
+
|
|
|
+ for qURL, messages := range qURLs {
|
|
|
+ if err := r.redriveQueueMessages(ctx, qURL, messages); err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return nil
|
|
|
+}
|
|
|
+
|
|
|
+func (r *redriver) redriveQueueMessages(ctx context.Context, qURL string, messages []Message) error {
|
|
|
+ smbre := make([]types.SendMessageBatchRequestEntry, len(messages))
|
|
|
+ for i, m := range messages {
|
|
|
+ m.MessageAttributes["previous-message-id"] = m.MessageId
|
|
|
+ mav, err := MessageAttributeValuesFromJSONable(m.MessageAttributes)
|
|
|
+ if err != nil {
|
|
|
+ return fmt.Errorf("failed converting message attributes for message %s on queue %q: %v",
|
|
|
+ m.MessageId, qURL, err)
|
|
|
+ }
|
|
|
+ smbre[i] = types.SendMessageBatchRequestEntry{
|
|
|
+ Id: aws.String(strconv.Itoa(i)),
|
|
|
+ MessageBody: &m.Body,
|
|
|
+ DelaySeconds: 0,
|
|
|
+ MessageAttributes: mav,
|
|
|
+ MessageDeduplicationId: nil,
|
|
|
+ MessageGroupId: nil,
|
|
|
+ MessageSystemAttributes: nil,
|
|
|
+ }
|
|
|
+ }
|
|
|
+ smbi := sqs.SendMessageBatchInput{
|
|
|
+ Entries: smbre,
|
|
|
+ QueueUrl: &qURL,
|
|
|
+ }
|
|
|
+ smbo, err := r.SendMessageBatch(ctx, &smbi)
|
|
|
+ if err != nil {
|
|
|
+ return fmt.Errorf("failed sending messages to queue %q: %v",
|
|
|
+ qURL, err)
|
|
|
+ }
|
|
|
+ log.Printf("%#v", smbo)
|
|
|
+ return nil
|
|
|
}
|
|
|
|
|
|
func RedriverService(dic *izidic.Container) (any, error) {
|