学习笔记 | Go语言操作RabbitMQ ( 1 )

1、url格式:amqp://帐号:密码@服务器地址:端口号/vhost

const MQURL = "amqp://zzl:[email protected]:5672/zzl"

2、定义RabbitMQ结构体

type RabbitMQ struct {
   conn *amqp.Connection
   channel *amqp.Channel
   //队列名称
   QueueName string
   //交换机
   Exchange string
   //Key
   Key string
   //Info
   Mqurl string
}

3、定义实例化方法以及断开方法

func NewRabbitMQ(QueueName string, Exchange string, Key string) *RabbitMQ {
   return &RabbitMQ{
      QueueName: QueueName,
      Exchange:  Exchange,
      Key:       Key,
      Mqurl:     MQURL,
   }
}

func (r *RabbitMQ) Destroy() {
   r.conn.Close()
   r.channel.Close()
}

4、定义错误处理方法

func (r *RabbitMQ) FailOnErr(err error, message string) {
   if err != nil {
      log.Fatalf("%s:%s", message, err)
      panic(fmt.Sprintf("%s:%s", message, err))
   }
}

5、创建simple模式下的RabbitMQ

Simple模式

func NewRabbitMQSimple(queueName string) *RabbitMQ {
   var err error
   rabbitmq := NewRabbitMQ(queueName, "", "")
   //exchange处为空 => 使用默认交换机(direct), key处为空 => 无key
   rabbitmq.conn, err = amqp.Dial(rabbitmq.Mqurl)
   rabbitmq.FailOnErr(err, "Failed to connect to RabbitMQ!")
   rabbitmq.channel, err = rabbitmq.conn.Channel()
   rabbitmq.FailOnErr(err, "Failed to connect to RabbitMQ!")
   return rabbitmq
}

6、生产并发送消息

func (r *RabbitMQ) PublishSimple(message string) {
      //若不存在队列则自动创建
   _, err := r.channel.QueueDeclare(
      r.QueueName,
      //是否持久化
      false,
      //是否自动删除
      false,
      //是否具有排他性
      false,
      //是否阻塞
      false,
      //额外参数
      nil,
      )
   if err != nil {
      log.Fatalf("%s:%s", message, err)
      panic(fmt.Sprintf("%s:%s", message, err))
   }
   //发送消息到队列
   r.channel.Publish(
      r.Exchange,
      r.QueueName,
      //如果为true,当无法找到符合条件的队列时将把消息自动返还
      false,
      //如果为true, 当队列上没有绑定消费者时将把消息自动返还。
      false,
      amqp.Publishing{
         ContentType:"text/plain",
         Body:[]byte(message),
      },
      )
}

7、消费消息

func (r *RabbitMQ) ConsumeSimple() {
   _, err := r.channel.QueueDeclare(
      r.QueueName,
      //是否持久化
      false,
      //是否自动删除
      false,
      //是否具有排他性
      false,
      //是否阻塞
      false,
      //额外参数
      nil,
   )
   if err != nil {
      fmt.Println(err)
   }
   msgs, err := r.channel.Consume(
      r.QueueName,
      //用来区分多个消费者
      "",
      //是否自动应答
      true,
      //是否具有排他性
      false,
      //若设置为true则无法将消息传递给同一个connection中的其它消费者
      false,
      //是否阻塞
      false,
      nil,
      )
   if err != nil {
      fmt.Println(err)
   }
   forever := make(chan bool)
   //处理消息
   go func() {
      for msg := range msgs {
         //TODO:处理消息
         log.Printf("Received a message : %s", msg.Body)
         fmt.Println(msg.Body)
      }
   }()


   log.Printf("[#]Waiting for messages, to exit press CTRL + C")
   <- forever
}

8、实例化测试消息发送与接收
在这里插入图片描述
管理界面队列出现波峰,控制台打印成功,说明成功生产并接受消息。

Simple模式生产消费测试成功。

发布了5 篇原创文章 · 获赞 0 · 访问量 107

猜你喜欢

转载自blog.csdn.net/zzl200012/article/details/105179777