如何循环通过通道接收的 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。
我有这样的代码:
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。