go 创建rabbitMq生产者和消费者示例

生产端示例代码
流程:
创建连接->声明交换机(如果需要多个交换机可创建对应的方法)->发送消息到交换机并指定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)
   }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值