1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
|
//go:build example
// +build example
package main
import (
"encoding/json"
"fmt"
"os"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/sqs"
"github.com/aws/aws-sdk-go/service/sqs/sqsiface"
)
func main() {
if len(os.Args) < 2 {
fmt.Fprintln(os.Stderr, "Queue URL required.")
os.Exit(1)
}
sess := session.Must(session.NewSession())
q := Queue{
Client: sqs.New(sess),
URL: os.Args[1],
}
msgs, err := q.GetMessages(20)
if err != nil {
fmt.Fprintln(os.Stderr, err.Error())
os.Exit(1)
}
fmt.Println("Messages:")
for _, msg := range msgs {
fmt.Printf("%s>%s: %s\n", msg.From, msg.To, msg.Msg)
}
}
// Queue provides the ability to handle SQS messages.
type Queue struct {
Client sqsiface.SQSAPI
URL string
}
// Message is a concrete representation of the SQS message
type Message struct {
From string `json:"from"`
To string `json:"to"`
Msg string `json:"msg"`
}
// GetMessages returns the parsed messages from SQS if any. If an error
// occurs that error will be returned.
func (q *Queue) GetMessages(waitTimeout int64) ([]Message, error) {
params := sqs.ReceiveMessageInput{
QueueUrl: aws.String(q.URL),
}
if waitTimeout > 0 {
params.WaitTimeSeconds = aws.Int64(waitTimeout)
}
resp, err := q.Client.ReceiveMessage(¶ms)
if err != nil {
return nil, fmt.Errorf("failed to get messages, %v", err)
}
msgs := make([]Message, len(resp.Messages))
for i, msg := range resp.Messages {
parsedMsg := Message{}
if err := json.Unmarshal([]byte(aws.StringValue(msg.Body)), &parsedMsg); err != nil {
return nil, fmt.Errorf("failed to unmarshal message, %v", err)
}
msgs[i] = parsedMsg
}
return msgs, nil
}
|