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

时间:2019-01-23 11:29:23

标签: 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)
    }

}

这是错误:

  

链接分离,原因:*错误{条件:amqp:未找到}

1 个答案:

答案 0 :(得分:1)

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

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

enter image description here

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

  

FATAL:未处理的错误链接xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx:状态码404和描述:消息传递实体'sb://.servicebus.windows.net/ MyQueueName '找不到。 TrackingId:f9fc309d-xxxx-xxxx-xxxx-8fccd694f266_G42,SystemTracker:.servicebus.windows.MyQueueName,时间戳:2019-01-25T09:45:28

因此,我认为该错误意味着您的代码中的队列MyQueueName在您的Azure Service Bus中不存在,您应该在使用前先创建它。

同时,正如@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对象),并返回与error不匹配的servicebus.DispositionActionmessage.CompleteAction方法返回servicebus.DispositionAction,但不适合接收消息代码。 enter image description here

请参考godoc Example (QueueSendAndReceive)的示例来修改您的代码。