Client library

Go have one AMQP library, it is activly maintained by steadway.

Below is a super simple example. In the example we start two different goroutines, one for subscribing and one for publishing. We share the same connection but create a new channel for each goroutine. In the subscribe goroutine, we declare a queue binds that queue to a exchange and then start subscribing. In the publish goroutine we publish a "Hello world" ping message every second.

package main

import (
    "github.com/streadway/amqp"

    "os"
    "fmt"
    "time"
)

func main() {
    url := os.Getenv("CLOUDAMQP_URL")
    if url == "" {
        url = "amqp://localhost"
    }
    connection, _ := amqp.Dial(url)
    defer connection.Close()
    go func(con *amqp.Connection) {
        channel, _ := connection.Channel()
        defer channel.Close()
        durable, exclusive := false, false
        autoDelete, noWait := true, true
        q, _ := channel.QueueDeclare("test", durable, autoDelete, exclusive, noWait, nil)
        channel.QueueBind(q.Name, "#", "amq.topic", false, nil)
        autoAck, exclusive, noLocal, noWait := false, false, false, false
        messages, _ := channel.Consume(q.Name, "", autoAck, exclusive, noLocal, noWait, nil)
        multiAck := false
        for msg := range messages {
            fmt.Println("Body:", string(msg.Body), "Timestamp:", msg.Timestamp)
            msg.Ack(multiAck)
        }
    }(connection)

    go func(con *amqp.Connection) {
        timer := time.NewTicker(1 * time.Second)
        channel, _ := connection.Channel()

        for t := range timer.C {
            msg := amqp.Publishing{
                DeliveryMode: 1,
                Timestamp:    t,
                ContentType:  "text/plain",
                Body:         []byte("Hello world"),
            }
            mandatory, immediate := false, false
            channel.Publish("amq.topic", "ping", mandatory, immediate, msg)
        }
    }(connection)

    select {}
}