@@ -29,46 +29,50 @@ func NewConsumer(client *sqs.SQS, queueURL string, ackOnConsume bool, visibility
2929}
3030
3131func (c * Consumer ) Consume (ctx context.Context , handle func (context.Context , * mq.Message , error ) error ) {
32- result , er1 := c .Client .ReceiveMessage (& sqs.ReceiveMessageInput {
33- AttributeNames : []* string {
34- aws .String (sqs .MessageSystemAttributeNameSentTimestamp ),
35- },
36- MessageAttributeNames : []* string {
37- aws .String (sqs .QueueAttributeNameAll ),
38- },
39- QueueUrl : c .QueueURL ,
40- MaxNumberOfMessages : aws .Int64 (1 ),
41- VisibilityTimeout : aws .Int64 (c .VisibilityTimeout ), // 20 seconds
42- WaitTimeSeconds : aws .Int64 (c .WaitTimeSeconds ),
43- })
44- if er1 != nil {
45- handle (ctx , nil , er1 )
46- } else {
47- if len (result .Messages ) > 0 {
48- m := result .Messages [0 ]
49- data := []byte (* m .Body )
50- attributes := PtrToMap (m .Attributes )
51- message := mq.Message {
52- Id : * m .MessageId ,
53- Data : data ,
54- Attributes : attributes ,
55- Raw : m ,
56- }
57- if c .AckOnConsume {
58- _ , er2 := c .Client .DeleteMessage (& sqs.DeleteMessageInput {
59- QueueUrl : c .QueueURL ,
60- ReceiptHandle : result .Messages [0 ].ReceiptHandle ,
61- })
62- if er2 != nil {
63- handle (ctx , nil , er2 )
32+ var result * sqs.ReceiveMessageOutput
33+ var er1 error
34+ loop:
35+ result , er1 = c .Client .ReceiveMessage (& sqs.ReceiveMessageInput {
36+ AttributeNames : []* string {
37+ aws .String (sqs .MessageSystemAttributeNameSentTimestamp ),
38+ },
39+ MessageAttributeNames : []* string {
40+ aws .String (sqs .QueueAttributeNameAll ),
41+ },
42+ QueueUrl : c .QueueURL ,
43+ MaxNumberOfMessages : aws .Int64 (1 ),
44+ VisibilityTimeout : aws .Int64 (c .VisibilityTimeout ), // 20 seconds
45+ WaitTimeSeconds : aws .Int64 (c .WaitTimeSeconds ),
46+ })
47+ if er1 != nil {
48+ handle (ctx , nil , er1 )
49+ } else {
50+ if len (result .Messages ) > 0 {
51+ m := result .Messages [0 ]
52+ data := []byte (* m .Body )
53+ attributes := PtrToMap (m .Attributes )
54+ message := mq.Message {
55+ Id : * m .MessageId ,
56+ Data : data ,
57+ Attributes : attributes ,
58+ Raw : m ,
59+ }
60+ if c .AckOnConsume {
61+ _ , er2 := c .Client .DeleteMessage (& sqs.DeleteMessageInput {
62+ QueueUrl : c .QueueURL ,
63+ ReceiptHandle : result .Messages [0 ].ReceiptHandle ,
64+ })
65+ if er2 != nil {
66+ handle (ctx , nil , er2 )
67+ } else {
68+ handle (ctx , & message , nil )
69+ }
6470 } else {
6571 handle (ctx , & message , nil )
6672 }
67- } else {
68- handle (ctx , & message , nil )
6973 }
7074 }
71- }
75+ goto loop
7276}
7377
7478func PtrToMap (m map [string ]* string ) map [string ]string {
0 commit comments