本文介紹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
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
}