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

Azure 从服务总线队列检索消息时出错,azure,go,azure-servicebus-queues,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/;Share

我试图使用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:未找到}


我在Github repo中搜索了错误信息,找到了代码,但没有对错误的任何解释

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

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

致命:未处理的错误链接xxxxxxxx-xxxx-xxxx-xxxx-XXXXXXXXXXXX:状态代码404和说明:找不到消息实体“sb://.servicebus.windows.net/MyQueueName。TrackingId:f9fc309d-xxxx-xxxx-xxxx-8fccd694f266_G42,SystemTracker:.servicebus.windows.MyQueueName,时间戳:2019-01-25T09:45:28

因此,我认为该错误意味着代码中的队列
MyQueueName
在Azure服务总线中不存在,您应该先创建它,然后再使用

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

根据的godoc,servicebus.HanderFunc方法的参数类型必须是
HandlerFunc
,这是代码中的函数返回
错误,而不是
servicebus.DispositionAction

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


请参考godoc的示例来修改您的代码。

与错误无关,但您的代码中似乎有错误,HandlerFunc应该返回
错误
,而不是
servicebus.DispositionAction
@Jerry Liu,@Peter Pan…我尝试了您提供的示例。但我又遇到了另一个错误。>无法将func文本(类型func(context.context,*servicebus.Message)错误)转换为类型servicebus.HandlerFunc
err = q.ReceiveOne(ctx, servicebus.HandlerFunc(func(ctx context.Context, message *servicebus.Message) servicebus.DispositionAction {
         fmt.Println(string(message.Data))
         return message.Complete()
     }))