Go语言NATS客户端无法订阅问题求助
问题分析与解决
嘿,我来帮你排查下这个问题~首先明确说:用fmt.Printf把消息打印到终端是完全正确的,这不是导致订阅失效的原因,核心问题出在其他地方,我给你拆解下:
核心问题1:程序执行后立刻退出,没有保持运行
NATS的订阅是异步机制,你的main函数在调用nc.Subscribe之后就直接执行完毕了,整个程序直接退出,根本没机会等待和接收消息。
解决方法很简单,在main函数末尾加一段阻塞逻辑,让程序一直保持运行状态,比如用空的select{}(它会一直阻塞当前goroutine):
// 在Subscribe代码之后添加 fmt.Println("已成功订阅,等待消息中...") select {} // 永久阻塞,保持程序运行
核心问题2:忽略了连接错误
你用nc, _ := nats.Connect(...)直接忽略了连接返回的错误,这会导致如果服务器地址无效、Token错误或者网络不通,程序连不上NATS服务器你都不知道,自然收不到消息。
一定要加上错误处理:
nc, err := nats.Connect(servers, nats.Token("TOKEN_KEY")) if err != nil { fmt.Printf("连接NATS服务器失败: %v\n", err) return } defer nc.Close() // 建议加上,程序退出时自动关闭连接
潜在小问题:服务器地址的空格
你的servers字符串里,逗号后面带了空格(比如nats://URL:30401, nats://URL:30402),虽然NATS客户端大概率能处理,但最好去掉空格,避免潜在的地址解析问题:
servers := "nats://URL:30401,nats://URL:30402,nats://URL:30403"
修正后的完整代码
package main import ( "fmt" "github.com/nats-io/go-nats" ) func main() { servers := "nats://URL:30401,nats://URL:30402,nats://URL:30403" nc, err := nats.Connect(servers, nats.Token("TOKEN_KEY")) if err != nil { fmt.Printf("连接NATS服务器失败: %v\n", err) return } defer nc.Close() // 订阅AAPL交易消息 _, err = nc.Subscribe("T.AAPL", func(m *nats.Msg) { fmt.Printf("[TRADE] Received: %s\n", string(m.Data)) }) if err != nil { fmt.Printf("订阅主题失败: %v\n", err) return } nc.Flush() if err := nc.LastError(); err != nil { fmt.Println(err) return } fmt.Println("已成功订阅T.AAPL主题,等待消息...") select {} // 保持程序运行 }
总结一下:你的打印逻辑没问题,主要是程序没有阻塞运行,加上错误处理和阻塞代码后,应该就能正常接收并打印消息了。
内容的提问来源于stack exchange,提问作者blonc
相关产品推荐
相关产品推荐

