【问题标题】:Error when retrieving message from Service Bus queue从服务总线队列中检索消息时出错
【发布时间】:2019-01-25 18:19:17
【问题描述】:

我尝试使用 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)
    }

}

这是错误:

链接分离,原因:*Error{Condition: amqp:not-found}

【问题讨论】:

  • 与错误无关,但您的代码似乎有些错误,HandlerFunc 应该返回error 而不是servicebus.DispositionAction

标签: azure go azure-servicebus-queues


【解决方案1】:

我在Github repo中搜索了错误信息,找到了代码ErrorNotFound MessageErrorCondition = "amqp:not-found",但是没有任何关于错误的解释。

我将它与官方文档Service Bus messaging exceptions中的C#中的Exception types和我的测试进行了比较,我认为它与以下相同。

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

致命:未处理的错误链接 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx:状态代码 404 和描述:消息传递实体 'sb://.servicebus.windows.net/MyQueueName' 找不到。 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

并且方法message.Complete应该传递一个参数ctx(一个context对象)并返回与servicebus.DispositionAction不匹配的errormessage.CompleteAction 方法返回 servicebus.DispositionAction ,但不适用于接收消息代码。

请参考godocExample (QueueSendAndReceive)的例子修改你的代码。

【讨论】:

  • @Jerry Liu ,@Peter Pan...我尝试了您提供的示例。但我又遇到了另一个错误。 > 无法将 func 文字(类型 func(context.Context, *servicebus.Message) 错误)转换为类型 servicebus.HandlerFunc
猜你喜欢
  • 1970-01-01
  • 2017-04-16
  • 2022-01-09
  • 2020-10-08
  • 2021-11-14
  • 1970-01-01
  • 1970-01-01
  • 2019-03-27
  • 1970-01-01
相关资源
最近更新 更多