Не удается удалить сообщение очереди хранилища Azure после его обновления (сообщение не найдено)

Использовал две разные библиотеки для node.js, azure-storage и fast-azure-storage, с тем же результатом.

Вот что я делаю:

  1. Создать сообщение с настройками по умолчанию - ок.
  2. Получить сообщение из очереди - ок.
  3. Обновите сообщение для сброса visibility timeout — ок.
  4. Удалить сообщение после обработки - Ошибка: MessageNotFound.

Если я пропущу обновление, все пойдет гладко.

Так что я делаю неправильно?

P.S. Пытался проанализировать http-трафик, похоже, он полностью соответствует документам. Как будто это внутренняя проблема Azure? Может быть у кого-то есть опыт обновления сообщений с использованием других языковых библиотек? Слишком неудобно для curl этого сервиса из-за расчета заголовка авторизации.


person Sergey B    schedule 19.11.2015    source источник


Ответы (2)


Как упоминается в документе Удалить сообщение, для функции требуется параметр popreceipt который возвращается Get Messages или Обновить сообщение.

И после операции обновления сообщения изменяется popreceipt этого сообщения. Итак, если ваш фрагмент кода выглядит так:

queueSvc.getMessages('myqueue', function(error, result, response){
  if(!error){
    // Messages retreived
    for(var index in result){
      var message = result[0];
      queueSvc.updateMessage('myqueue', message.messageid, message.popreceipt, 0, {messageText: 'new text'}, function(error, result, response){
          if(!error){
            // Message updated successfully
            console.log('result: '+JSON.stringify(result));
            console.log(message.popreceipt)
            queueSvc.deleteMessage('myqueue', message.messageid, message.popreceipt, function(error, response){
                if(!error){
                    console.log(response);
                  // Message deleted
                }else{
                    console.log(error);
                }
              });
          }else{
            console.log(error);
          }
        });
    }
  }
});

У вас возникнет проблема, и вы можете отслеживать в командлете, мы обнаружили, что popreceipt изменилось после операции обновления.

Поэтому, если вам нужно удалить сообщение после операции обновления, вы должны использовать объект result, который является новым объектом сообщения после обновления.

queueSvc.deleteMessage('myqueue', result.messageid, result.popreceipt, function(error, response){
            if(!error){
                console.log(response);
              // Message deleted
            }else{
                console.log(error);
            }
          });
person Gary Liu    schedule 20.11.2015
comment
Спасибо, Гэри! Это было мое предположение. Меня ввела в заблуждение fast-azure-storage, которая игнорирует новую popreceipt. А официальный модуль действительно очень тормозит с очередями. - person Sergey B; 20.11.2015
comment
Кстати, это уже реализовано в модуле fast-azure-storage. - person Sergey B; 25.11.2015
comment
Да, кажется, что функция updateMessage вернет новый popreceipt из исходный код - person Gary Liu; 27.11.2015
comment
Да, на самом деле это там после моего запроса на вытягивание, основанного на вашем ответе здесь :) - person Sergey B; 28.11.2015

Что вы имели в виду под «обновить сообщение для сброса времени ожидания видимости»? Вы установили тайм-аут невидимости на ноль? Если это так, ошибка на шаге 4 ожидается, поскольку вам не разрешено удалить сообщения, которые видны в данный момент.

person Zhaoxing Lu    schedule 19.11.2015
comment
Нет, я хотел снова установить его на 30 секунд. - person Sergey B; 20.11.2015