本文介绍Go SDK的版本说明、使用说明和示例代码。

Version 1.0.2

  • 更新日期

    2021-03-05

    SDK 下载

  • 更新内容

    支持OpenService接口。

Version 1.0.1

  • 更新日期

    2021-01-15

    SDK 下载

  • 更新内容
    • 支持设置超时。
    • 在返回中添加Request ID。

Version 1.0.0

  • 更新日期

    2019-04-30

    SDK 下载

  • 更新内容
    • 支持队列模型的相关操作:
      • 创建、修改、获取和删除队列。
      • 发送、查看、消费和删除队列消息,以及修改队列消息的下次可消费时间。
    • 支持主题模型的相关操作:
      • 创建、修改和删除主题。
      • 创建和删除订阅。
      • 发送主题消息。

使用说明

  1. 下载最新版Go SDK,解压后进入aliyun-mns-go-sdk-master目录。
  2. 修改app.conf.example文件,配置urlaccess_key_idaccess_key_secret
  3. 进入example目录,后续使用的脚本都在该目录。

示例代码

队列模型

本示例包括创建队列、发送消息、接收和删除消息、以及删除队列等操作。

package main

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
    _ "net/http/pprof"
    "time"

    "github.com/gogap/logs"
    "github.com/aliyun/aliyun-mns-go-sdk"
)

type appConf struct {
    Url             string `json:"url"`
    AccessKeyId     string `json:"access_key_id"`
    AccessKeySecret string `json:"access_key_secret"`
}

func main() {
    go func() {
        log.Println(http.ListenAndServe("localhost:8080", nil))
    }()

    conf := appConf{}

    if bFile, e := ioutil.ReadFile("app.conf.example"); e != nil {
        panic(e)
    } else {
        if e := json.Unmarshal(bFile, &conf); e != nil {
            panic(e)
        }
    }

    client := ali_mns.NewAliMNSClient(conf.Url,
        conf.AccessKeyId,
        conf.AccessKeySecret)
    queueManager := ali_mns.NewMNSQueueManager(client)
    // 创建队列,队列名称为test。
    err := queueManager.CreateQueue("test", 0, 65536, 345600, 30, 0, 3)

    time.Sleep(time.Duration(2) * time.Second)

    if err != nil && !ali_mns.ERR_MNS_QUEUE_ALREADY_EXIST_AND_HAVE_SAME_ATTR.IsEqual(err) {
        fmt.Println(err)
        return
    }
    msg := ali_mns.MessageSendRequest{
        MessageBody:  "hello <\"aliyun-mns-go-sdk\">",
        DelaySeconds: 0,
        Priority:     8}
    queue := ali_mns.NewMNSQueue("test", client)
    // 发送消息。
    for i := 1; i < 10000; i++ {
        ret, err := queue.SendMessage(msg)

        go func() {
            fmt.Println(queue.QPSMonitor().QPS())
        }()

        if err != nil {
            fmt.Println(err)
        } else {
            logs.Pretty("response:", ret)
        }

        endChan := make(chan int)
        respChan := make(chan ali_mns.MessageReceiveResponse)
        errChan := make(chan error)
        go func() {
            select {
            case resp := <-respChan:
                {
                    logs.Pretty("response:", resp)
                    logs.Debug("change the visibility: ", resp.ReceiptHandle)
                    if ret, e := queue.ChangeMessageVisibility(resp.ReceiptHandle, 5); e != nil {
                        fmt.Println(e)
                    } else {
                        logs.Pretty("visibility changed", ret)
                        logs.Debug("delete it now: ", ret.ReceiptHandle)
                        if e := queue.DeleteMessage(ret.ReceiptHandle); e != nil {
                            fmt.Println(e)
                        }
                        endChan <- 1
                    }
                }
            case err := <-errChan:
                {
                    fmt.Println(err)
                    endChan <- 1
                }
            }
        }()
        //接收消息。
        queue.ReceiveMessage(respChan, errChan, 30)
        <-endChan
    }
}

主题模型

本示例包括创建队列、创建主题、订阅主题和发布消息等操作。

package main

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "time"

    "github.com/gogap/logs"
    "github.com/aliyun/aliyun-mns-go-sdk"
)

type appConf struct {
    Url             string `json:"url"`
    AccessKeyId     string `json:"access_key_id"`
    AccessKeySecret string `json:"access_key_secret"`
}

func main() {
    conf := appConf{}

    if bFile, e := ioutil.ReadFile("app.conf.example"); e != nil {
        panic(e)
    } else {
        if e := json.Unmarshal(bFile, &conf); e != nil {
            panic(e)
        }
    }

    client := ali_mns.NewAliMNSClient(conf.Url,
        conf.AccessKeyId,
        conf.AccessKeySecret)

    // 创建队列,队列名称为testQueue。
    queueManager := ali_mns.NewMNSQueueManager(client)
    err := queueManager.CreateSimpleQueue("testQueue")
    if err != nil && !ali_mns.ERR_MNS_QUEUE_ALREADY_EXIST_AND_HAVE_SAME_ATTR.IsEqual(err) {
        fmt.Println(err)
        return
    }

    // 创建主题,主题名称为testTopic。
    topicManager := ali_mns.NewMNSTopicManager(client)
    // topicManager.DeleteTopic("testTopic")
    err = topicManager.CreateSimpleTopic("testTopic")
    if err != nil && !ali_mns.ERR_MNS_TOPIC_ALREADY_EXIST_AND_HAVE_SAME_ATTR.IsEqual(err) {
        fmt.Println(err)
        return
    }

    // 订阅主题,本示例中的endpoint设置为队列名称。
    topic := ali_mns.NewMNSTopic("testTopic", client)
    sub := ali_mns.MessageSubsribeRequest{
        Endpoint: topic.GenerateQueueEndpoint("testQueue"),
        NotifyContentFormat: ali_mns.SIMPLIFIED,
    }

    // topic.Unsubscribe("SubscriptionNameA")
    err = topic.Subscribe("SubscriptionNameA", sub)
    if err != nil && !ali_mns.ERR_MNS_SUBSCRIPTION_ALREADY_EXIST_AND_HAVE_SAME_ATTR.IsEqual(err) {
        fmt.Println(err)
        return
    }

    time.Sleep(time.Duration(2) * time.Second)

    // 发布消息。
    msg := ali_mns.MessagePublishRequest{
        MessageBody: "hello topic <\"aliyun-mns-go-sdk\">",
    }
    _, err = topic.PublishMessage(msg)
    if err != nil {
        fmt.Println(err)
        return
    }

    // 从队列中接收消息。
    queue := ali_mns.NewMNSQueue("testQueue", client)

    endChan := make(chan int)
    respChan := make(chan ali_mns.MessageReceiveResponse)
    errChan := make(chan error)
    go func() {
        select {
        case resp := <-respChan:
            {
                logs.Pretty("response:", resp)
                fmt.Println("change the visibility: ", resp.ReceiptHandle)
                if ret, e := queue.ChangeMessageVisibility(resp.ReceiptHandle, 5); e != nil {
                    fmt.Println(e)
                } else {
                    logs.Pretty("visibility changed", ret)
                    fmt.Println("delete it now: ", ret.ReceiptHandle)
                    if e := queue.DeleteMessage(ret.ReceiptHandle); e != nil {
                        fmt.Println(e)
                    }
                    endChan <- 1
                }
            }
        case err := <-errChan:
            {
                fmt.Println(err)
                endChan <- 1
            }
        }
    }()

    queue.ReceiveMessage(respChan, errChan, 30)
    <-endChan
}