rabbitMQ go语言简单实现

发送端代码

package main

import (
  "fmt"
  "log"
  "time"

  "github.com/streadway/amqp"
)

func failOnError(err error, msg string) {
  if err != nil {
    log.Fatalf("%s : %s", msg, err)
  }
}

func connectMQ() {
  conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
  failOnError(err, "Failed to opem a channel")
  defer conn.Close()
  ch, err := conn.Channel()
  failOnError(err, "Fail open a chennel")
  defer ch.Close()

  q, err := ch.QueueDeclare(
    "hello",
    false,
    false,
    false,
    false,
    nil,
  )

  failOnError(err, "failed to declare a quene")

  forerver := make(chan bool)

  go func() {
    count := 0
    for {
      count += 1
      body := fmt.Sprintf("%s , %d", "hello world", count)
      err = ch.Publish(
        "",
        q.Name,
        false,
        false,
        amqp.Publishing{
          ContentType: "text/plain",
          Body:        []byte(body),
        })

      failOnError(err, "Failed to publish a message")
      time.Sleep(100 * time.Millisecond)
    }
  }()

  <-forerver

}

func main() {
  connectMQ()
}

自动应答 接收端代码

package main

import (
  "log"
  "time"

  "github.com/streadway/amqp"
)

func failOnError(err error, msg string) {
  if err != nil {
    log.Fatalf("%s - %s ", msg, err)
  }
}

func reviceMQ() {
  conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
  failOnError(err, "failed to connect to rabbitmq")
  defer conn.Close()

  ch, err := conn.Channel()
  failOnError(err, " Failede to open achannel")
  defer ch.Close()

  
  ch.Qos(1, 0, true)
  q, err := ch.QueueDeclare(
    "hello",
    false,
    false,
    false,
    false,
    nil,
  )

  failOnError(err, "failed to declare a queue ")

自动应答, 这样会造成 工人 死亡时 详细丢失

 msgs, err := ch.Consume(
    q.Name,
    "",
    true, // 自动应答 标识
    false,
    false,
    false,
    nil,
  )

  forever := make(chan bool)

  go func() {
    for {
      d := <-msgs
      log.Printf("Receied a message : %s \n len msgs : %d \n", d.Body, len(msgs))

      time.Sleep(400 * time.Millisecond)
      d.Ack(true)
    }

  }()

  log.Printf(" waiting for messages , to exit press ctrl+c")
  <-forever

}

func main() {
  reviceMQ()
}

使用说明

sender 与 reciver serve 都可以启动多份,来提高队列效率

什么是自动应答?

自动应答就是,接到任务就认为完成,

PrefetchCount

PrefetchSize

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yuemake999

请我喝茶呗

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值