我试图使用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:未找到}
答案 0 :(得分:1)
我在Github存储库中搜索了错误信息,但发现了代码ErrorNotFound MessageErrorCondition = "amqp:not-found"
,但是没有任何关于错误的解释。
我将其与来自官方文档Service Bus messaging exceptions
的C#中的Exception types
和我的测试进行了比较,我认为与下面相同。
在我的环境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
代码。
应该向方法message.Complete
传递参数ctx
(一个context
对象),并返回与error
不匹配的servicebus.DispositionAction
。 message.CompleteAction
方法返回servicebus.DispositionAction
,但不适合接收消息代码。
请参考godoc Example (QueueSendAndReceive)
的示例来修改您的代码。