網頁

2022/3/30

Golang 本機接收SQS queue的訊息

本範例在locahost的Go應用程式以AWS的SDK aws-sdk-go-v2從SQS queue接收訊息。


範例環境:

  • Go 1.18
  • github.com/aws/aws-sdk-go-v2/service/sqs v1.18.2


事前要求

參考「Golang 建立AWS SQS API client」建立SQS API client。

參考「AWS console建立SQS queue範例」建立一個名稱為DemoQueue的SQS queue並發送一個"hello"訊息。


從SQS queue接收訊息

建立sqs.GetQueueUrlInput物件並設定QueueName為queue的名稱,傳入sqs.Client.GetQueueUrl()取得GetQueueUrlOutput.QueueUrl

建立接收訊息物件sqs.ReceiveMessageInput並傳入sqs.Client.ReceiveMessage()從SQS queue接收訊息並返回sqs.ReceiveMessageOutput並從ReceiveMessageOutput.Messages取得多筆訊息。types.Message.MessageID為Message ID;types.Message.Body為訊息內容。

由於ReceiveMessageInput.WaitTimeSeconds預設為0為short polling,所以可能接收到空訊息。

main.go

package main

import (
    "context"
    "fmt"

    "github.com/aws/aws-sdk-go-v2/config"
    "github.com/aws/aws-sdk-go-v2/service/sqs"
)

func main() {
    ctx := context.TODO()
    client := NewSQSClient(ctx)

    qn := "DemoQueue"
    urlInput := &sqs.GetQueueUrlInput{
        QueueName: &qn,
    }

    urlOutput, err := client.GetQueueUrl(ctx, urlInput)
    if err != nil {
        panic(err)
    }

    rmInput := &sqs.ReceiveMessageInput{
        QueueUrl:            urlOutput.QueueUrl,
        MaxNumberOfMessages: 1,
        VisibilityTimeout:   5,
    }

    rmOutput, err := client.ReceiveMessage(ctx, rmInput)
    if err != nil {
        panic(err)
    }

    if rmOutput.Messages != nil {
        fmt.Println(*rmOutput.Messages[0].MessageId)
        fmt.Println(*rmOutput.Messages[0].Body)
    }
}

func NewSQSClient(ctx context.Context) *sqs.Client {
    cfg, err := config.LoadDefaultConfig(
        ctx,
        config.WithRegion("ap-northeast-1"),
    )
    if err != nil {
        panic(err)
    }

    return sqs.NewFromConfig(cfg) // Create an Amazon EC2 service client
}

github


測試

執行Go應用程式印出接收訊息的Message ID及訊息內容如下。

aadeb265-108f-4d02-9aa3-01b3781e4607
hello


沒有留言:

張貼留言