RabbitMQ - 使用amqp库连接RabbitMQ(实例使用)

1、发送端

步骤分解如下:
(1)建立连接
conn, err := amqp.Dial("amqp://admin:admin@dev.com:5672/")

(2)打开channel
这里的channel 是AMQP 里的概念,可以理解为 多路复用的一个tcp长连接。

(3)声明一个队列
q, err := ch.QueueDeclare( ... )

(4)创建消息
msg := amqp.Publishing{ ... }

(5)发布消息
err = ch.Publish( ... )

复制代码
package main
 
import (
    "github.com/streadway/amqp"
    "log"
)
 
func failOnError(err error, msg string) {
    if err != nil {
        log.Fatalf("%s: %s", msg, err)
    }
}
 
func main() {
    // 连接 RabbitMQ
    conn, err := amqp.Dial("amqp://admin:admin@dev.com:5672/")
    failOnError(err, "连接失败")
    defer conn.Close()
 
    // 建立一个 channel ( 其实就是TCP连接 )
    ch, err := conn.Channel()
    failOnError(err, "打开通道失败")
    defer ch.Close()
 
    // 创建一个名字叫 "hello" 的队列
    q, err := ch.QueueDeclare(
        "hello", // name
        false,   // durable
        false,   // delete when unused
        false,   // exclusive
        false,   // no-wait
        nil,     // arguments
    )
    failOnError(err, "创建队列失败")
 
    // 构建一个消息
    body := "Hello World!"
    msg := amqp.Publishing{
        ContentType: "text/plain",
        Body:        []byte(body),
    }
 
    // 构建一个生产者,将消息 放入队列
    err = ch.Publish(
        "",     // exchange
        q.Name, // routing key
        false,  // mandatory
        false,  // immediate
        msg)
    log.Printf(" [x] Sent %s", body)
    failOnError(err, "Failed to publish a message")
}
 
复制代码

 

2、接收端

2.2 接收端
步骤分解如下:
(1)建立连接
conn, err := amqp.Dial("amqp://admin:admin@dev.com:5672/")

(2)打开channel
这里的channel 是AMQP 里的概念,可以理解为 多路复用的一个tcp长连接。

(3)声明一个队列
q, err := ch.QueueDeclare( ... )

(4)构建一个消费者
msgChan, err := ch.Consume( ... )

(5)不断的读取消息

for d := range msgChan {
log.Printf("收到消息: %s", d.Body)
}

复制代码
package main
 
import (
    "github.com/streadway/amqp"
    "log"
)
 
func failOnError(err error, msg string) {
    if err != nil {
        log.Fatalf("%s: %s", msg, err)
    }
}
 
func main() {
    // 连接 RabbitMQ
    conn, err := amqp.Dial("amqp://admin:admin@dev.com:5672/")
    failOnError(err, "连接失败")
    defer conn.Close()
 
    // 建立一个 channel ( 其实就是TCP连接 )
    ch, err := conn.Channel()
    failOnError(err, "打开通道失败")
    defer ch.Close()
 
    // 创建一个名字叫 "hello" 的队列
    q, err := ch.QueueDeclare(
        "hello", // name
        false,   // durable
        false,   // delete when unused
        false,   // exclusive
        false,   // no-wait
        nil,     // arguments
    )
    failOnError(err, "创建队列失败")
 
    // 开启一个 消费者
    // 返回值是 ch 类型
    msgChan, err := ch.Consume(
        q.Name, // queue
        "",     // consumer
        true,   // auto-ack
        false,  // exclusive
        false,  // no-local
        false,  // no-wait
        nil,    // args
    )
    failOnError(err, "注册消费者 ,失败")
 
    //帮助阻塞
    forever := make(chan bool)
 
    // 开启一个 go程
    go func() {
        for d := range msgChan {
            log.Printf("收到消息: %s", d.Body)
        }
    }()
 
    log.Printf(" 等待消息...")
    <-forever
}
 
复制代码

3. 可能遇到的问题

1)遇到 “Reason: "username or password not allowed"”
缺少权限,可能账户密码错误,也可能使用了 guest 账户未处理远程连接。考虑新建一个高权限的用户。

2)遇到 “no access to this vhost”
 admin 赋予权限,使之可以访问 vhost 或者检查MQ服务配置客户端的连接数
下面的指令 为 admin 赋予权限,使得可以访问 vhost 名字为 / 的资源。

rabbitmqctl set_permissions -p / admin "." "." "."
说明:
/ 是个 vhost 资源名称
"." "." "." 标识权限的类型,和读写权限。

posted @   李若盛开  阅读(493)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
点击右上角即可分享
微信分享提示