如何让我的消费者使用 Azure sdk for Golang v0.3.1 监听 Azure 服务总线上的消息?

Posted

技术标签:

【中文标题】如何让我的消费者使用 Azure sdk for Golang v0.3.1 监听 Azure 服务总线上的消息?【英文标题】:How do I keep my consumer listening the messages on Azure Sevice Bus using Azure sdk for Golang v0.3.1? 【发布时间】:2022-01-13 17:58:22 【问题描述】:

我一直在使用模块 azure-sdk-for-go/sdk/messaging/azservicebus v0.3.1 将我的使用者与 Azure 服务总线连接,但实现的代码仅接收固定数量的消息,然后停止应用程序我想让消费者一直在听队列。按照我的代码:

    client, err := azservicebus.NewClientFromConnectionString("Connection String", nil)
    
    if err != nil 
        log.Fatalf("Failed to create Service Bus Client: %s", err.Error())
    

    receiver, err := client.NewReceiverForQueue("queue", nil)

    if err != nil 
        log.Fatalf("Failed to create Consumer: %s", err.Error())
    

    messages, err := receiver.ReceiveMessages(context.TODO(), 10, nil)

    if err != nil 
        log.Fatalf("Failed to receive Messages: %s", err.Error())
    

    for _, message := range messages 

        body, err := message.Body()

        if err != nil 
            log.Fatalf("Failed to parse message body: %s", err.Error())
        

        fmt.Println("Message --->", string(body))

        err = receiver.CompleteMessage(context.TODO(), message)

        if err != nil 
            log.Fatalf("Failed to complete message: %s", err.Error())
        

        fmt.Printf("Received and completed message\n")

    

【问题讨论】:

那么,您不必多次致电messages, err := receiver.ReceiveMessages(context.TODO(), 10, nil) 吗? 我不想将 for 放在代码中。我真的很想把责任留给 sdk 模块。 很高兴您的问题已得到解决。您可以接受并投票赞成答案,以便对可能面临相同问题的其他社区成员有所帮助。 【参考方案1】:

您拥有 99% 的代码 - 正如您所指出的,ReceiveMessages 只返回您请求的数量。

所以你只想将你的逻辑包装在一个循环中,这样你就可以连续运行它:

for 
    messages, err := receiver.ReceiveMessages(context.TODO(), 10, nil)
    if err != nil 
        log.Fatalf("Failed to receive Messages: %s", err.Error())
    

    for _, message := range messages 
        body, err := message.Body()

        if err != nil 
            log.Fatalf("Failed to parse message body: %s", err.Error())
        

        fmt.Println("Message --->", string(body))

        err = receiver.CompleteMessage(context.TODO(), message)

        if err != nil 
            log.Fatalf("Failed to complete message: %s", err.Error())
        
    

顺便说一句,0.3.2 刚刚发布,其中包含一些您会感兴趣的修复,因为它们确实会影响 ReceiveMessages。

【讨论】:

另外,@danielfarrell 有正确的答案,但我显然没有足够的声誉来发表评论。 我不想将for 放在代码中。我真的很想把责任留给 sdk 模块。 @RafaelReis,API 做流量控制没有意义。轮询队列是一个不确定的操作。你是唯一知道 for 循环何时结束、何时迭代以及循环的内部结构是什么的人。 @DanielFarrell 我不同意,在 nodejs 中使用 Azure 消息代理的示例:import ServiceBusClient from '@azure/service-bus' export default async (config) => ServiceBusClient .createFromConnectionString(config.connection) .createQueueClient(config.queueName) .createReceiver(config.receiveMode) .registerMessageHandler(config.handler, config.errorHandler) azure sdk 负责在队列中进行“轮询”。当某些消息到达时,将调用处理程序。 当然,在异步 nodejs 领域,一切都是回调。嘿,如果你能找到对它的 SDK 支持,对于 Go SDK,太好了!我没看到,但也许我错过了!

以上是关于如何让我的消费者使用 Azure sdk for Golang v0.3.1 监听 Azure 服务总线上的消息?的主要内容,如果未能解决你的问题,请参考以下文章

azure-sdk-for-python:获取指定资源组的托管磁盘列表

Azure 事件中心 - 如何使用官方 SDK 并行使用事件?

如何使用 Azure SDK for Python 更改 Office 365 用户头像

如何将传入消息映射到 Azure Eventhub 中的使用者组

使用 Azure.ServiceBus.Messaging C# SDK for SAS 令牌的服务总线连接字符串

使用 Azure JS SDK for Service Bus 时需要关闭连接吗?