如何循环通过通道接收的 NATS 消息

How to loop NATS messages received over channel

我有这样的代码:

package main


import (
    "fmt"

    "github.com/nats-io/nats.go"
)

func main()  {
    nc, _ := nats.Connect(nats.DefaultURL)
    for {
        nc.Subscribe("request", func(m *nats.Msg) {
            fmt.Printf("Received a message: %s\n", string(m.Data))
            m.Respond([]byte("Received"))
        })
    }
}

我尝试做的是接收消息,并在收到消息后发送对消息的回复,永远如示例所示。

但是上面的代码,有一些问题。当我将 for { 添加到代码中时,它会重复相同的消息,直到收到新消息。

使用 NATS 连续接收消息的正确实现是什么? (不回复收到的消息)

看来您最终会无限制地订阅该主题。您只需调用一次 Subscribe 方法。

首先,Subscribe 方法正在返回一些东西,我们应该保存 Subscribe(...) 方法的值。

s, err := nc.Subscribe(subj, msgHandler)
// handle err
for {
 // if something happened, quit the loop
}
s.Unsubscribe()

subj 上有新消息时,将调用 msgHandle。所以你只需要等待。创建订阅后,您可能会无限循环等待。

不过,我觉得还是用频道订阅比较好。

// Channel Subscriber
ch := make(chan *nats.Msg, 64)
sub, err := nc.ChanSubscribe("foo", ch)
// handle err
for msg := range ch {
    // do something to the nats.Msg object
}
// Unsubscribe if needed
sub.Unsubscribe()
close(ch)

请考虑阅读文档 here