2023-01-18 07:42:14 -08:00
|
|
|
package sqs
|
|
|
|
|
|
|
|
import (
|
2023-01-26 09:15:39 -08:00
|
|
|
"context"
|
2023-01-18 07:42:14 -08:00
|
|
|
"time"
|
|
|
|
|
2023-01-26 09:15:39 -08:00
|
|
|
"github.com/aws/aws-sdk-go-v2/aws"
|
|
|
|
aws_sqs "github.com/aws/aws-sdk-go-v2/service/sqs"
|
|
|
|
aws_sqs_types "github.com/aws/aws-sdk-go-v2/service/sqs/types"
|
2023-01-18 07:42:14 -08:00
|
|
|
)
|
|
|
|
|
|
|
|
// ConsumerOption represents a consumer option function.
|
|
|
|
type ConsumerOption func(*Consumer)
|
|
|
|
|
|
|
|
// Consumer represents SQS consumer.
|
|
|
|
type Consumer struct {
|
2023-01-26 09:15:39 -08:00
|
|
|
api *aws_sqs.Client
|
2023-01-18 07:42:14 -08:00
|
|
|
url string
|
2023-01-26 09:15:39 -08:00
|
|
|
maxMessages int32
|
|
|
|
visibilityTimeout int32
|
|
|
|
waitTimeSeconds int32
|
2023-01-18 07:42:14 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
// New instances of a Consumer to consume SQS messages.
|
2023-01-26 09:15:39 -08:00
|
|
|
func NewConsumer(awsConfig aws.Config, url string, opts ...ConsumerOption) (*Consumer, error) {
|
2023-01-18 07:42:14 -08:00
|
|
|
consumer := &Consumer{
|
2023-01-26 09:15:39 -08:00
|
|
|
api: aws_sqs.NewFromConfig(awsConfig),
|
2023-01-18 07:42:14 -08:00
|
|
|
url: url,
|
2023-01-26 09:15:39 -08:00
|
|
|
maxMessages: 10,
|
|
|
|
visibilityTimeout: 60,
|
|
|
|
waitTimeSeconds: 20,
|
2023-01-18 07:42:14 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
for _, opt := range opts {
|
|
|
|
opt(consumer)
|
|
|
|
}
|
|
|
|
|
|
|
|
return consumer, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// WithMaxMessages allows to specify an maximum number of messages to return when setting a value.
|
2023-01-26 09:15:39 -08:00
|
|
|
func WithMaxMessages(v int32) ConsumerOption {
|
2023-01-18 07:42:14 -08:00
|
|
|
return func(c *Consumer) {
|
2023-01-26 09:15:39 -08:00
|
|
|
c.maxMessages = v
|
2023-01-18 07:42:14 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// WithVisibilityTimeout allows to specify a visibility timeout when setting a value.
|
2023-01-26 09:15:39 -08:00
|
|
|
func WithVisibilityTimeout(v int32) ConsumerOption {
|
2023-01-18 07:42:14 -08:00
|
|
|
return func(c *Consumer) {
|
2023-01-26 09:15:39 -08:00
|
|
|
c.visibilityTimeout = v
|
2023-01-18 07:42:14 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// WithWaitTimeSeconds allows to specify a wait time when setting a value.
|
2023-01-26 09:15:39 -08:00
|
|
|
func WithWaitTimeSeconds(v int32) ConsumerOption {
|
2023-01-18 07:42:14 -08:00
|
|
|
return func(c *Consumer) {
|
2023-01-26 09:15:39 -08:00
|
|
|
c.waitTimeSeconds = v
|
2023-01-18 07:42:14 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// GetMessages retrieves messages from SQS.
|
2023-01-26 09:15:39 -08:00
|
|
|
func (c *Consumer) GetMessages() ([]aws_sqs_types.Message, error) {
|
2023-01-18 07:42:14 -08:00
|
|
|
params := &aws_sqs.ReceiveMessageInput{
|
|
|
|
QueueUrl: aws.String(c.url),
|
|
|
|
MaxNumberOfMessages: c.maxMessages,
|
2023-01-26 09:15:39 -08:00
|
|
|
AttributeNames: []aws_sqs_types.QueueAttributeName{
|
|
|
|
aws_sqs_types.QueueAttributeNameAll,
|
2023-01-18 07:42:14 -08:00
|
|
|
},
|
2023-01-26 09:15:39 -08:00
|
|
|
MessageAttributeNames: []string{
|
|
|
|
string(aws_sqs_types.QueueAttributeNameAll),
|
2023-01-18 07:42:14 -08:00
|
|
|
},
|
|
|
|
WaitTimeSeconds: c.waitTimeSeconds,
|
|
|
|
VisibilityTimeout: c.visibilityTimeout,
|
|
|
|
}
|
|
|
|
|
2023-01-26 09:15:39 -08:00
|
|
|
res, err := c.api.ReceiveMessage(context.TODO(), params)
|
2023-01-18 07:42:14 -08:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
return res.Messages, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// DeleteMessage deletes messages from SQS.
|
2023-01-26 09:15:39 -08:00
|
|
|
func (c *Consumer) DeleteMessage(msg *aws_sqs_types.Message) error {
|
2023-01-18 07:42:14 -08:00
|
|
|
params := &aws_sqs.DeleteMessageInput{
|
|
|
|
QueueUrl: aws.String(c.url),
|
|
|
|
ReceiptHandle: msg.ReceiptHandle,
|
|
|
|
}
|
2023-01-26 09:15:39 -08:00
|
|
|
_, err := c.api.DeleteMessage(context.TODO(), params)
|
2023-01-18 07:42:14 -08:00
|
|
|
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
// GetVisibilityTimeout returns visibility timeout.
|
|
|
|
func (c *Consumer) GetVisibilityTimeout() time.Duration {
|
2023-01-26 09:15:39 -08:00
|
|
|
return time.Duration(int64(c.visibilityTimeout) * int64(time.Second))
|
2023-01-18 07:42:14 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
// GetQueueAttributes get queue attributes.
|
|
|
|
func (c *Consumer) GetQueueAttributes() (*aws_sqs.GetQueueAttributesOutput, error) {
|
|
|
|
params := &aws_sqs.GetQueueAttributesInput{
|
|
|
|
QueueUrl: aws.String(c.url),
|
2023-01-26 09:15:39 -08:00
|
|
|
AttributeNames: []aws_sqs_types.QueueAttributeName{
|
|
|
|
aws_sqs_types.QueueAttributeNameCreatedTimestamp,
|
2023-01-18 07:42:14 -08:00
|
|
|
},
|
|
|
|
}
|
2023-01-26 09:15:39 -08:00
|
|
|
return c.api.GetQueueAttributes(context.TODO(), params)
|
2023-01-18 07:42:14 -08:00
|
|
|
}
|