本文介绍Go SDK的版本说明、使用说明和示例代码。
Version 1.0.3
更新日期
2024-05-31
更新内容
支持自定义HTTP Transport配置。
客户端信息增加版本号和操作系统信息。
新增客户端初始化方法,支持从环境变量中获取配置信息。
Version 1.0.2
更新日期
2021-03-05
更新内容
支持OpenService接口。
Version 1.0.1
更新日期
2021-01-15
更新内容
支持设置超时。
在返回中添加Request ID。
Version 1.0.0
更新日期
2019-04-30
更新内容
支持队列模型的相关操作:
创建、修改、获取和删除队列。
发送、查看、消费和删除队列消息,以及修改队列消息的下次可消费时间。
支持主题模型的相关操作:
创建、修改和删除主题。
创建和删除订阅。
发送主题消息。
使用说明
下载最新版Go SDK,解压后进入aliyun-mns-go-sdk-master目录。
修改app.conf.example文件,配置url、access_key_id和access_key_secret。
url
访问轻量消息队列(原 MNS)的接入地址,登录轻量消息队列(原 MNS)控制台查看。具体操作,请参见获取接入点。
access_key_id和access_key_secret
阿里云身份验证,在RAM控制台创建。获取方式,请参见创建AccessKey。
进入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
}
文档内容是否对您有帮助?