Ошибка при получении сообщения из очереди служебной шины - PullRequest
0 голосов
/ 23 января 2019

Я пытался извлечь сообщения из очереди служебной шины Azure с помощью Go, но я получил ошибку при запуске кода.Вот мой код.

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: not-found}

1 Ответ

0 голосов
/ 25 января 2019

Я искал информацию об ошибке в репозитории Github и нашел код ErrorNotFound MessageErrorCondition = "amqp:not-found", но нет никаких объяснений этой ошибки.

Я сравнил ее с Exception types в C # из официального документа Service Bus messaging exceptions и моего тестирования, я думаю, это то же самое, что и ниже.

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, 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,тип параметра метода servicebus.HanderFunc должен быть HandlerFunc, который является функцией возврата error, а не servicebus.DispositionAction в вашем коде.

enter image description here

И методу message.Complete должен быть передан параметр ctx (объект context) и возвращено error, которое не соответствует servicebus.DispositionAction.Метод message.CompleteAction возвращает servicebus.DispositionAction, но не подходит для кода получения сообщения.enter image description here

Пожалуйста, обратитесь к примеру godoc Example (QueueSendAndReceive), чтобы изменить ваш код.

...