我正在使用rabbitmq和golang,我像在rabbitmq示例中那样在comsumer端创建一个等待消息的线程。我想主线程将等待kill信号并发送信号给rabbitmq线程,但如果消息没有推入队列,rabbitmq线程永远等待,所以它不处理kill信号消息。 我发现rabbitmq在comsumer中有超时,但我刚刚在java中找到了代码,而不是golang。 你能帮助我吗?谢谢。
答案 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将退出,事情应该干净地关闭。