Превышено ограничение скорости пользователя в Admin SDK

Я работаю с Admin SDK. Когда я обновляю одного пользователя, он работает нормально, но когда я пытаюсь обновить группу (1000) пользователей, я получаю Исключение превышения ограничения скорости пользователя. Пожалуйста, проверьте мой код и скажите, что мне не хватает? или сказать любое предложение?

 private Directory getDirectoryService(String adminEmailAddress){
 Directory directoryService = null;
 try {
      Collection<String> SCOPES = new ArrayList<String>();
      SCOPES.add("https://www.googleapis.com/auth/admin.directory.user");
      SCOPES.add("https://www.googleapis.com/auth/admin.directory.user.readonly");
      SCOPES.add("https://www.googleapis.com/auth/admin.directory.group");
      SCOPES.add("https://www.googleapis.com/auth/admin.directory.group.readonly");
      SCOPES.add("https://www.googleapis.com/auth/admin.directory.orgunit");
      SCOPES.add("https://www.googleapis.com/auth/admin.directory.orgunit.readonly");
      SCOPES.add("https://www.googleapis.com/auth/userinfo.profile");

      HttpTransport httpTransport = new NetHttpTransport();
      JacksonFactory jsonFactory = new JacksonFactory();
      GoogleCredential credential = new GoogleCredential.Builder()
      .setTransport(httpTransport)
      .setJsonFactory(jsonFactory)
      .setServiceAccountId(SERVICE_ACCOUNT_EMAIL)
      .setServiceAccountScopes(SCOPES)
      .setServiceAccountUser(adminEmailAddress)
      .setServiceAccountPrivateKeyFromP12File(new                                                         java.io.File(SERVICE_ACCOUNT_PKCS12_FILE_PATH)).build();

    directoryService = new Directory.Builder(httpTransport,jsonFactory, credential).setApplicationName("gdirectoryspring").build();

 } catch(Exception e){
   ErrorHandler.errorHandler(this.getClass().getName(), e);
 }
 return directoryService;
}

Ниже приведено обновление кода пользователя.

Directory directoryService = getDirectoryService("adminEmailAddress");
User user = directoryService.users().get("userPrimaryEmail").execute();
       List<UserOrganization> organizaionList = user.getOrganizations();
       for (int j = 0; j < organizaionList.size(); j++)
       {
         UserOrganization singleOrg = organizaionList.get(j);
         if (singleOrg != null)
         {
          if ("work".equalsIgnoreCase(singleOrg.getCustomType()) ||singleOrg.getPrimary() != null)  
  {
  if (singleOrg.getTitle() != null)
  { 
    singleOrg.setTitle(jobTitle);
   }
  }
 }
  user.setOrganizations(organizaionList);
}

       Update update= directoryService.users().update(primaryEmail, user);
       User userUpdated = update.execute();

и в консоли администратора я увеличил свой лимит, как показано ниже

Admin SDK   10.0 requests/second/user

но до тех пор, пока я не получу сообщение Превышено ограничение скорости пользователя Excepiton. Может кто-нибудь мне помочь?


person RBP    schedule 29.11.2013    source источник


Ответы (1)


Вам не хватает экспоненциального отката. См. пример здесь (для диска, но его можно адаптировать) https://developers.google.com/drive/handle-errors#implementing_exponential_backoff там вы увидите, как он обрабатывает такие ошибки, как 'userRateLimitExceeded'

person Zig Mandel    schedule 29.11.2013
comment
не знаю, почему это было отмечено. это правильный ответ. Он получает ожидаемое превышение предельной скорости пользователя Excepiton, потому что он вызывает API 1000 раз в цикле, когда его лимит составляет 10 запросов в секунду. Ему просто нужно обработать ошибку и внедрить экспоненциальную отсрочку, чтобы повторить попытку текущего элемента в цикле. он также может поместить сон в ключевые области, но это не так универсально и будет ждать больше, чем нужно. - person Zig Mandel; 29.11.2013
comment
Я реализовал экспоненциальное резервное копирование, теперь я получаю сообщение об ошибке ниже.‹b›403.‹/b› ‹ins›Это ошибка.‹/ins›‹p›К сожалению, у вас нет доступа к этой странице . ‹ins›Это все, что мы знаем.‹/ins› - person RBP; 25.02.2014
comment
Я добавил exp backoff , но получил те же проблемы. Thread.sleep((1 ‹‹ n) * 1000 + randomGenerator.nextInt(1001)); - person RBP; 26.02.2014