文档

Go Demo

本章节为您介绍了Go语言获取回执消息示例方法。

下载SDK

获取回执消息,您需要下载alibaba-cloud-sdk-go

示例方法

说明

调用接口前,需配置环境变量,通过环境变量读取访问凭证。AccessKey ID和AccessKey Secret的环境变量名:VMS_AK_ENV 、VMS_SK_ENV。配置详情请参见配置访问凭证

import (
    "os",
    "encoding/base64"
    "fmt"
    "github.com/aliyun/alibaba-cloud-sdk-go/sdk/endpoints"
    "github.com/aliyun/alibaba-cloud-sdk-go/services/dybaseapi"
    "github.com/aliyun/alibaba-cloud-sdk-go/services/dybaseapi/mns"
    "time"
)

const (
    mnsDomain = "1943695596114318.mns.cn-hangzhou.aliyuncs.com"
)

func main() {
    endpoints.AddEndpointMapping("cn-hangzhou", "Dybaseapi", "dybaseapi.aliyuncs.com")

    // 阿里云账号AccessKey ID拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户
    // 此处以把AccessKey ID和 AccessKey Secret 保存在环境变量为例说明。 您也可以根据业务需要,保存到配置文件里
    // 强烈建议不要把 AccessKey ID和 AccessKey Secret 保存到代码里,会存在密钥泄漏风险
    // 创建client实例
    client, err := dybaseapi.NewClientWithAccessKey(
        "cn-hangzhou",           // 您的可用区ID
        os.Getenv("VMS_AK_ENV"),  // 您的AccessKey ID
        os.Getenv("VMS_SK_ENV"))  // 您的AccessKey Secret
    if err != nil {
        // 异常处理
        panic(err)
    }

    queueName := "<QueueName>"
    messageType := "<MessageType>"

    var token *dybaseapi.MessageTokenDTO

    for {
        if token == nil || token.ExpireTime - time.Now().Unix() > 2 * 60 {
            // 创建API请求并设置参数
            request := dybaseapi.CreateQueryTokenForMnsQueueRequest()
            request.MessageType = messageType
            request.QueueName = queueName
            // 发起请求并处理异常
            response, err := client.QueryTokenForMnsQueue(request)
            if err != nil {
                // 异常处理
                panic(err)
            }

            token = &response.MessageTokenDTO
        }

        mnsClient, err := mns.NewClientWithStsToken(
            "cn-hangzhou",
            token.AccessKeyId,
            token.AccessKeySecret,
            token.SecurityToken,
        )

        if err != nil {
            panic(err)
        }

        mnsRequest := mns.CreateBatchReceiveMessageRequest()
        mnsRequest.Domain = mnsDomain
        mnsRequest.QueueName = queueName
        mnsRequest.NumOfMessages = "10"
        mnsRequest.WaitSeconds = "5"

        mnsResponse, err := mnsClient.BatchReceiveMessage(mnsRequest)
        if err != nil {
            panic(err)
        }
        // fmt.Println(mnsResponse)

        receiptHandles := make([]string, len(mnsResponse.Message))
        for i, message := range mnsResponse.Message {
            messageBody, decodeErr := base64.StdEncoding.DecodeString(message.MessageBody)
            if decodeErr != nil {
                panic(decodeErr)
            }
            fmt.Println(string(messageBody))
            receiptHandles[i] = message.ReceiptHandle
        }
        if len(receiptHandles) > 0 {
            mnsDeleteRequest := mns.CreateBatchDeleteMessageRequest()
            mnsDeleteRequest.Domain = mnsDomain
            mnsDeleteRequest.QueueName = queueName
            mnsDeleteRequest.SetReceiptHandles(receiptHandles)
            //_, err = mnsClient.BatchDeleteMessage(mnsDeleteRequest) // 取消注释将删除队列中的消息
            if err != nil {
                panic(err)
            }
        }
    }
}
  • 本页导读 (1)
文档反馈