RabbitMQ简单模式和work模式

RabbitMQ简单模式和work模式

使用的语言是go语言,框架beego ,废话不多说直接代码

一、操作rabbitmq的工具包


使用的工具包是github.com/streadway/amqp

go get github.com/streadway/amqp

import "github.com/streadway/amqp" 

二、创建连接


使用的函数时amqp.Dail(),直接将连接封装起来,因为每个模式生产者和消费者都要进行连接

func Connect() (*amqp.Connection, error) {
     
  conn, err := amqp.Dial("amqp://用户名:密码@rabbitmqIp:5672/")
  return conn, err
}

参数说明:Dail(“amqp://用户名:密码@rabbitmqIp:5672/”)

三、创建发送端函数


步骤:

  1. 创建连接 并且使用defer 关闭连接

  2. 创建channel通道并使用defer 关闭连接

  3. 创建队列,然后才能向队列发送消息 ,使用:channel.QueueDecclare()

  4. 发送消息 .使用:ch.Publish()

/**
 * @Description: 简单模式和work模式生产者函数
 * @param exchange 交换机名称  简单和work模式下exchange为空
 * @param queueName 队列名称
 * @param body  消息内容
 * @return error 返回值
 */
func Publish(exchange string, queueName string, body string) error {
     
  //连接
  conn, err := Connect()
  if err != nil {
     
    return err
  }
  defer conn.Close()

  //创建channel
  ch, err := conn.Channel()
  if err != nil {
     
    return err
  }
  defer ch.Close()
  //声明一个队列供我们发送,然后才能向队列发送消息
  //第一个参数 队列名称  第二个参数 是否持久化 第三个参数 是否删除 第四个参数 是否唯一 第五个参数 是否等待 第六个其它参数
  q, err := ch.QueueDeclare(queueName, true, false, false, false, nil)
  if err != nil {
     
    return err
  }
  //发送消息
  //第一参数 交换机名称 ,第二个参数 队里名称 第三个参数 是否强制 第四个参数 立即执行 ,第五个 消息体
  err = ch.Publish(exchange, q.Name, false, false,
    amqp.Publishing{
     DeliveryMode: amqp.Persistent, ContentType: "text/plain", Body: []byte(body)})
  return err
}

四、创建消费端函数


步骤:

  1. 创建连接 并且使用defer 关闭连接

  2. 创建channel通道并使用defer 关闭连接

  3. 声明消费队列,并与生产者函数保持一致 ,使用:channel.QueueDeclare

  4. 做队列声明,因为消费者可能在生产者之前启动,所以要确保使用消息之前队列已经存在,使用:ch.Consume

  5. 接收消息

/**
 * @Description: 简单模式和work模式消费者函数
 * @param exchange
 * @param queueName
 * @param callback
 */
func ReceiveMsg(exchange string, queueName string, callback Callback) {
     
  //先建立连接
  conn, err := Connect()
  if err != nil {
     
    failOnError(err, "Failed to connect to RabbitMQ")
    return
  }
  defer conn.Close()

  //创建channel
  ch, err := conn.Channel()
  if err != nil {
     
    failOnError(err, "Failed to open Channel")
    return
  }
  defer ch.Close()

  //声明消费队列,与发送端相匹配
  //参数 第一个参数 队列名称,第二个参数 是否持久化  第三个参数 是否删除 第四个参数 是否独一  第五个参数 是否等待 第六个其他参数
  q, err := ch.QueueDeclare(queueName, true, false, false, false, nil)
  if err != nil {
     
    failOnError(err, "Failed to create QueueDeclare")
    return
  }

  // 做队列声明,因为消费者可能在生产者之前启动
  //参数 第一个参数 队列名称,第二个参数 消费者  第三个参数 是否自动应答 第四个参数 是否独一  第五个参数 是否局部 第六个参数是否等待 第七个其他参数 nil
  msgs, err := ch.Consume(q.Name, "", false, false, false, false, nil)
  if err != nil {
     
    failOnError(err, "Failed to register QueueDeclare")
    return
  }
  
  //接收消息
  forever := make(chan bool)

  go func() {
     
    for d := range msgs {
     
      s := BytesToString(&(d.Body))
      callback(*s)
      _ = d.Ack(false) //如果ch.Consume第三个参数否自动应答为false,需要我们手动应答,添加此行代码,如果为true 不需要
    }
  }()
  log.Printf(" [*] Waiting for messages. To exit press CTRL+C")
  <-forever
}

五、运行生产端和消费端


生产端


这里使用的是beego框架,直接通过路由来访问生产者

//简单模式和work工作模式, push方法
func (m *MqController) GetMq() {
     
  go func() {
     
    count := 0
    for {
     
      err := mq.Publish("", "fyouku_demo", "hello+"+strconv.Itoa(count))
      fmt.Println(err)
      count++
      time.Sleep(1 * time.Second)
    }
  }()
  m.Ctx.WriteString("HELLO")
}

运行效果
RabbitMQ简单模式和work模式_第1张图片

消费端


新建个mq/work/main.go文件


func main()  {
     
  mq.ReceiveMsg("","fyouku_demo",callback)
}

func callback(s string)  {
     
  fmt.Printf("Msg is :%s\n",s)
} 

通过终端进入main.go;通过命令bee run运行文件

RabbitMQ简单模式和work模式_第2张图片

进入rabittmq管理界面,就可以看到刚才运行的队列了

RabbitMQ简单模式和work模式_第3张图片

你可能感兴趣的:(rabbitmq,go)