gpt4 book ai didi

go - golang 消费者端超时 rabbitmq

转载 作者:数据小太阳 更新时间:2023-10-29 03:26:12 26 4
gpt4 key购买 nike

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

最佳答案

如果我对您的问题的理解正确,您希望能够退出例行处理队列?

超时设置在这里不起作用。这是针对服务器/客户端心跳的,只有在任何时候都没有收到心跳时才会启动,但不会因为队列中没有收到帧而做任何事情。

我的建议是这样的

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
}
}

现在,如果您向您的程序发送终止信号,它会捕捉到它,关闭停止 channel ,您的队列处理 goroutine 将退出,并且一切都应该干净地关闭。

关于go - golang 消费者端超时 rabbitmq,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41140907/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com