0

我有这样的代码:

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 连续接收消息的正确实现是什么?(不回复收到的消息)

4

1 回答 1

2

看起来您最终将获得对该主题的无限订阅。您只需要调用一次订阅方法。

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

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

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

但是,我认为使用频道进行订阅会更好。

// 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)

请考虑阅读此处的文档。

于 2020-08-29T14:36:01.003 回答