網頁

2022/11/17

Golang RabbitMQ hello world 發送訊息範例

Go程式發送訊息到RabbitMQ的hello world範例。


本篇參考RabbitMQ Tutorials - "Hello World"

範例環境:



安裝套件

在專案跟目錄以命令列輸入go get github.com/rabbitmq/amqp091-go下載RabbitMQ官方維護的Go RabbitMQ Client Library,Go利用此套件與RabbitMQ溝通。


範例程式

匯入amqp套件amqp "github.com/rabbitmq/amqp091-go"

呼叫amqp.Dial(url string)取得連線物件。url參數為RabbitMQ的AMQP帳密及位址。例如在本機的RabbitMQ位址預設為amqp://guest:guest@localhost:5672/

呼叫Connection.Channel()建立與RabbitMQ的訊息通道。

呼叫Channel.QueueDeclare()建立queue,參數如下:

  • name string - queue的名稱。
  • durable bool - RabbitMQ重啟時是否繼續存在。
  • autoDelete bool - 當最後一個consumer取消訂閱時是否自動刪除。
  • exclusive bool - 是否只被目前的connection使用且connection關閉時自動刪除。
  • noWait bool - 是否不等待RabbitMQ server的回應,若server無法完成操作則丟出例外
  • args Table - 其他參數。

呼叫Channel.PublishWithContext()發送訊息,參數如下:

  • ctx Context - context物件。
  • exchange string - 接收訊息的exchange名稱。
  • key string - routing key名稱。
  • mandatory bool - 訊息傳遞到queue失敗時是否返回給發送者。
  • immediate bool - 若沒有consumer接收訊息時是否丟棄訊息。
  • msg Publishing - 發送的訊息參數及訊息主體。

main.go

package main

import (
    "context"
    "log"
    "time"

    amqp "github.com/rabbitmq/amqp091-go" // 匯入套件
)

func main() {
    // 取得連線
    conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
    failOnError(err, "Failed to connect to RabbitMQ")
    defer conn.Close()

    // 建立通道
    ch, err := conn.Channel()
    failOnError(err, "Failed to open a channel")
    defer ch.Close()

    // 建立queue
    q, err := ch.QueueDeclare(
        "hello", // name
        false,   // durable
        false,   // delete when unused
        false,   // exclusive
        false,   // no-wait
        nil,     // arguments
    )
    failOnError(err, "Failed to declare a queue")

    // 設定回應時間
    ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
    defer cancel()

    body := "hello world" // 訊息內容
    err = ch.PublishWithContext(ctx,
        "",     // default exchange
        q.Name, // routing key
        false,  // mandatory
        false,  // immediate
        // 設定訊息屬性
        amqp.Publishing{
            ContentType: "text/plain",
            Body:        []byte(body),
        })
    failOnError(err, "Failed to publish a message")
    log.Printf("message sent\n")
}

func failOnError(err error, msg string) {
    if err != nil {
        log.Panicf("%s: %s", msg, err)
    }
}

github



測試

執行程式後返回如下。

2022/11/18 11:59:49 message sent

前往RabbitMQ UI管理介面的[Queue]頁面可看到上面程式新建的queue "hello"有一個待收訊息。



點選[hello]進入在下方[Get messages]點擊Get Message(s)可看到送來的訊息"hello world"。



接著參考「Golang RabbitMQ hello world 接收訊息範例


沒有留言:

張貼留言