azure - 从服务总线队列检索消息时出错

标签 azure go azure-servicebus-queues

我尝试使用 Go 从 azure 服务总线队列中提取消息,但运行代码时出现错误。这是我的代码。

func Example_queue_receive() {
   ctx, cancel :=context.WithTimeout(context.Background(),10*time.Second)
   defer cancel() 
   connectionString :="Endpoint=sb://{my_service_name}.servicebus.windows.net/;SharedAccessKeyName = RootManageSharedAccessKey;SharedAccessKey={my_shared_access_key_value}" 

    // Create a client to communicate with a Service Bus Namespace.
    ns, err := servicebus.NewNamespace(servicebus.NamespaceWithConnectionString(connectionString))
    if err != nil {
        fmt.Println(err)
    }

    // Create a client to communicate with the queue.
    q, err := ns.NewQueue("MyQueueName")
    if err != nil {
       fmt.Println("FATAL: ", err)
    }

    err = q.ReceiveOne(ctx, servicebus.HandlerFunc(func(ctx context.Context, message *servicebus.Message) servicebus.DispositionAction {
         fmt.Println(string(message.Data))
         return message.Complete()
     }))
    if err != nil {
        fmt.Println("FATAL: ", err)
    }

}

这是错误:

link detached, reason: *Error{Condition: amqp:not-found}

最佳答案

我在Github仓库中搜索了错误信息,找到了代码ErrorNotFound MessageErrorCondition = "amqp:not-found" ,但没有对错误进行任何解释。

我将它与 Exception types 进行了比较在C#中,根据官方文档服务总线消息传递异常和我的测试,我认为与下面的相同。

enter image description here

在我的环境中go版本go1.11.3 windows/amd64,我在没有现有队列MyQueueName的情况下运行类似的代码,我得到了下面类似的错误。

FATAL: unhandled error link xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx: status code 404 and description: The messaging entity 'sb://.servicebus.windows.net/MyQueueName' could not be found. TrackingId:f9fc309d-xxxx-xxxx-xxxx-8fccd694f266_G42, SystemTracker:.servicebus.windows.MyQueueName, Timestamp:2019-01-25T09:45:28

所以我认为该错误意味着代码中的队列 MyQueueName 不存在于 Azure 服务总线中,您应该在使用之前先创建它。

同时,正如@JerryLiu所说,下面的代码有一些错误。

err = q.ReceiveOne(ctx, servicebus.HandlerFunc(func(ctx context.Context, message *servicebus.Message) servicebus.DispositionAction {
         fmt.Println(string(message.Data))
         return message.Complete()
     }))

根据 azure-service-bus-go 的 godoc ,servicebus.HanderFunc方法的参数类型必须是HandlerFunc,它是一个返回error的函数,而不是servicebus.DispositionAction > 在您的代码中。

enter image description here

并且方法message.Complete应该传递一个参数ctx(一个context对象)并返回errorservicebus.DispositionAction 不匹配。 message.CompleteAction 方法返回 servicebus.DispositionAction ,但不适合接收消息代码。 enter image description here

请引用godoc Example (QueueSendAndReceive)的例子修改您的代码。

关于azure - 从服务总线队列检索消息时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54326241/

相关文章:

node.js - Azure Functions 的服务总线队列输出绑定(bind)不支持 'ScheduledEnqueueTimeUtc' ?

linux - 无法从 kubernetes pod 挂载 azure 文件共享(在本地计算机上工作正常)

azure - 从多个租户获取虚拟机详细信息

Go 对 ARM 寄存器 R10 和 R11 的限制

go - 从函数返回的正确方法是什么?

azure - 如何配置服务总线功能 2.x 的最大重试次数?

azure - Bicep - 将数组与循环配对

azure - 在应用程序见解中禁用另存为查询

asp.net-mvc - 通用 SSO 解决方案

mongodb - 在对象的生命周期内保持 MongoDB session 打开是否明智?