Накопительный лимит времени ожидания tryLock / waitLock для скрипта приложения Google для последующих вызовов веб-приложений? - PullRequest
1 голос
/ 11 июля 2020

Я пытался отладить проблему, при которой я записываю несколько новых строк (через несколько HTTP GET) в электронную таблицу Google с помощью GAS, но они, похоже, не смогли получить блокировку после того, как некоторые из них были написаны. Изначально у меня был тайм-аут до 5000 мс (5 секунд), что должно было быть достаточно времени для одного вызова, но я заметил, что если мне нужно было добавить 20 строк, этот тайм-аут приводил к сбою случайных обновлений строк. Когда я переместил время на 30 сек c, тогда 20 строк работали нормально. Но если я перешел к 60 рядам, я снова получал случайные неудачи. Перемещение на 60 сек. c тайм-аут, похоже, работал.

Похоже, что этот тайм-аут эффективно должен учитывать совокупное время, которое потребуется для записи всех строк. Чем больше я думаю об этом, я думаю, что это имеет смысл, поскольку я делаю эти вызовы из проекта flutter / web с помощью метода asyn c. Приведенный ниже код дротика для HTTP GET ...

  void submitOrder(String orderParms) async {
    try {
      String fullURL = "$URL$orderParms";
      await http.get(fullURL).then((response) {
        callback(convert.jsonDecode(response.body)['status']);
      });
    } catch (e) {
      print(e);
    }
  }

Метод GAS doGet ниже ...

function doGet(request){
  var prodID = "1qNt0Q-not-K37U-the-Ea8Fa-real-ynUF-url-xwskYfmDgnMEw2lX_LFblSuDw"; 
  var result = {"status": "SUCCESS"};
  try {
    // Get all Parameters
    var lastName   = request.parameter.lastName;
    var firstName  = request.parameter.firstName;
    var lock = LockService.getUserLock();  
    if (lock.tryLock(60000)) {     // currently using 60 sec to be safe??
      // Open the correct sheetGoogle Sheet using ID
      var sheet_prod = SpreadsheetApp.openById(prodID);
      var rowData    = sheet_prod.appendRow([lastName, firstName]);
      // Need to flush these updates so they fully take before releasing the lock
      SpreadsheetApp.flush();
      // ok, done important spreadsheet stuff, release the lock
      lock.releaseLock();
    // else did not get a lock
    } else {
      result = {"status": "FAILED - No Lock!", "message": "Lock timed out"};      
    }
  } catch(exc){
    result = {"status": "Exception! FAILED", "message": exc.message};
  }
  // Return result
  return ContentService
  .createTextOutput(JSON.stringify(result))
  .setMimeType(ContentService.MimeType.JSON);  
}

В настоящее время у меня установлен тайм-аут 60 секунд, чтобы я мог обрабатывать вроде 30-40 рядов без сбоев, чтобы получился замок. Есть ли вред в установке такого высокого тайм-аута? Любые идеи очень ценятся !!

1 Ответ

0 голосов
/ 11 июля 2020

Официальные документы не упоминают какой-либо «вред» от использования «большого» числа milliseconds, поэтому это полностью зависит от того, влияет или нет на цель вашего веб-приложения и / или цель ваша электронная таблица.

Примечание: поскольку ваш код не вносит никаких изменений в электронную таблицу после того, как вы отпустите do c, нет необходимости включать SpreadsheetApp.flush().

...