我尝试使用 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#中,根据官方文档服务总线消息传递异常
和我的测试,我认为与下面的相同。
在我的环境中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
> 在您的代码中。
并且方法message.Complete
应该传递一个参数ctx
(一个context
对象)并返回error
与 servicebus.DispositionAction
不匹配。 message.CompleteAction
方法返回 servicebus.DispositionAction
,但不适合接收消息代码。
请引用godoc Example (QueueSendAndReceive)
的例子修改您的代码。
关于azure - 从服务总线队列检索消息时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54326241/