在golang comsumer方面超时rabbitmq

时间:2016-12-14 10:58:41

标签: go rabbitmq

我正在使用rabbitmq和golang,我像在rabbitmq示例中那样在comsumer端创建一个等待消息的线程。我想主线程将等待kill信号并发送信号给rabbitmq线程,但如果消息没有推入队列,rabbitmq线程永远等待,所以它不处理kill信号消息。 我发现rabbitmq在comsumer中有超时,但我刚刚在java中找到了代码,而不是golang。 你能帮助我吗?谢谢。

1 个答案:

答案 0 :(得分:0)

如果我理解你的问题,你希望能够退出例行处理队列吗?

超时设置在此处不起作用。这适用于服务器/客户端心跳,只有在任何时间没有收到心跳时才会启动,但是不会在队列中没有接收到任何帧。

我建议的是

import "sync"
import "os/signal"

var (
  wg sync.WaitGroup
  sigs = make(chan os.Signal, 1)
  stop = make(chan bool)
)

func main () {

  signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT)

  //your other setup stuff

  wg.Add(2)
  go myQueueProcessor()
  go mySignalProcessor()

  //Now your main will wait for your goroutines to finish here.
  wg.Wait()

  //your program cleanup stuff
}

func myQueueProcessor() {
   defer wg.Done()
  //keep running over the select indefinitely
  for {
    select {
      case <-stop: //if the stop channel is closed exit out of go routine
        return
      case msg := <-sub.C:  //Whatever queue processes you want
         //do message stuff
    }
  }
}

func mySignalProcessor() {
  defer wg.Done()
  select {
    case sig := <-sigs:
      close(stop)
      return
  }
}

现在,如果你向程序发送一个kill信号,它将捕获它,关闭停止通道,你的队列处理goroutine将退出,事情应该干净地关闭。