生产端示例代码
流程:
创建连接->声明交换机(如果需要多个交换机可创建对应的方法)->发送消息到交换机并指定RoutingKey
package main
import (
"context"
amqp091 "github.com/rabbitmq/amqp091-go"
"log"
"time"
)
// 生产端
func main() {
//创建连接
conn, err := amqp091.Dial("amqp://admin:admin@localhost:5672")
if err != nil {
log.Print("连接失败")
}
defer conn.Close()
ch, _ := conn.Channel()
defer ch.Close()
//声明交换机 交换机需要生产端提前声明
err1 := ch.ExchangeDeclare("exchange2", "direct", true, false, false, false, nil)
if err1 != nil {
log.Print("声明交换机失败")
}
//创建不同RoutingKey的消息
go createMsg(ch, "exchange2", "info", "你好 info")
go createMsg(ch, "exchange2", "error", "你好 error")
go createMsg(ch, "exchange2", "debug", "你好 debug")
//阻塞主进程
chian := make(chan struct{})
chian <- struct{}{}
}
func createMsg(ch *amqp091.Channel, exchange string, key string, msg string) {
//创建限时context
ctx, cancel := context.WithTimeout(context.Background(), 100*time.Second)
defer cancel()
//发送消息到交换机并指定RoutingKey
err := ch.PublishWithContext(ctx, exchange, key, false, false, amqp091.Publishing{Body: []byte(msg)})
if err != nil {
log.Print("发送消息失败")
}
}
消费端示例代码
流程:
创建连接–>通过QueueDeclare创建队列信息(如有多个交换机和不同的key课创建方法通过参数传递)–>通过QueueBind方法为队列绑定交换机和RoutingKey–>通过Consume接受消息 消息为chan类型可通过遍历阻塞去获取body
package main
import (
amqp091 "github.com/rabbitmq/amqp091-go"
"log"
)
// 消费端
func main() {
//创建连接
conn, err := amqp091.Dial("amqp://admin:admin@localhost:5672")
if err != nil {
log.Print("连接失败")
}
defer conn.Close() //结束时关闭连接
//创建多个队列信息对应不同的RoutingKey
go createQueue(conn, 1, "exchange2", "info", "error")
go createQueue(conn, 2, "exchange2", "debug")
go createQueue(conn, 3, "exchange2", "debug", "info")
chian := make(chan struct{})
chian <- struct{}{}
}
func createQueue(conn *amqp091.Connection, index int, exchange string, keys ...string) {
ch, _ := conn.Channel()
defer ch.Close()
//声明队列
q, err := ch.QueueDeclare("", false, true, true, false, nil)
if err != nil {
log.Print("声明队列失败")
}
//遍历绑定keys
for _, key := range keys {
err := ch.QueueBind(q.Name, key, exchange, false, nil)
if err != nil {
log.Print(err)
}
}
//创建消息接受者
createConsumer(ch, q.Name, index)
}
func createConsumer(ch *amqp091.Channel, queueName string, index int) {
//消息接收者
sume, err := ch.Consume(queueName, "", false, false, false, false, nil)
if err != nil {
log.Print(err)
}
//阻塞监听消息 sume为chan类型
for body := range sume {
log.Printf("index:[%v]-----msg:[%s]", index, body.Body)
body.Ack(false)
}
}