go__sqs_demo/back/services/producer.go
2023-01-23 20:40:23 +01:00

71 lines
1.7 KiB
Go

package services
import (
"context"
"encoding/json"
"io"
"log"
"math/rand"
"time"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/service/sqs"
"github.com/aws/aws-sdk-go-v2/service/sqs/types"
"github.com/fgm/izidic"
)
func ProducerService(dic *izidic.Container) (any, error) {
cli := dic.MustService("sqs").(*sqs.Client)
w := dic.MustParam(PWriter).(io.Writer)
return func(ctx context.Context, qName string) {
senderHandler(ctx, w, cli, qName)
}, nil
}
func senderHandler(ctx context.Context, _ io.Writer, client *sqs.Client, qURL string) {
pinger := time.NewTicker(2 * time.Second)
for range pinger.C {
sendOne(ctx, client, qURL)
}
}
func sendOne(ctx context.Context, client *sqs.Client, qURL string) {
data := map[string]int{"a": rand.Int()}
data["b"] = data["a"] + 1
bs, _ := json.Marshal(data)
body := string(bs)
ma := map[string]types.MessageAttributeValue{
"x": {
DataType: aws.String("String"),
StringValue: aws.String("a string value"),
},
"y": {
DataType: aws.String("Number"),
StringValue: aws.String("42"),
},
"retry": {
DataType: aws.String("String"),
StringValue: aws.String("1"),
},
}
smr := sqs.SendMessageInput{
MessageBody: &body,
QueueUrl: &qURL,
DelaySeconds: 0,
MessageAttributes: ma,
MessageDeduplicationId: nil,
MessageGroupId: nil,
MessageSystemAttributes: nil,
}
smo, err := client.SendMessage(ctx, &smr)
if err != nil {
log.Printf("failed producing message: %v", err)
} else if smo.MessageId == nil {
log.Println("message produced with a nil ID")
} else {
log.Printf("message %s produced with %#v", *smo.MessageId, data)
}
}