google drive sdk - files - La cuota API de Google Drive excedió
sdk de drive (2)
Estoy creando un canal que recibe cambios en los usuarios que están en mi aplicación. El principal problema es que después de 2-3 webhooks, recibo un error que dice que el usuario ha excedido los límites de la cuota.
Eso no tiene sentido, porque solo recibí 2 mensajes (lo vi en ngrok).
He pasado a la consola de google en la API de la unidad y la cuota. Cada vez que recibo un webhook, la cantidad de consultas aumenta en 500. Por lo tanto, cuando un usuario realiza dos cambios y yo recibo dos webhooks, el número de consultas supera el 1000 permitido por google y recibo ese error.
Ese es el código donde habilito el canal:
@GET
@Path("/enable")
public void enable(@Context HttpServletRequest request, @Context HttpServletResponse response) throws IOException {
Credential credential = initFlow().loadCredential("user");
Drive service = new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential).setApplicationName(APPLICATION_NAME).build();
Channel channel = new Channel();
channel.setId(UUID.randomUUID().toString());
channel.setType("web_hook");
channel.setAddress("https://389825dc.ngrok.io/GDriveRest/app/gdrive/webhook");
StartPageToken page = service.changes().getStartPageToken().execute();
GDrive.savedPageToken = page.getStartPageToken();
service.changes().watch(savedPageToken, channel).execute();
}
Y el siguiente es el webhook:
@POST
@Path("/webhook")
public void webhook(@Context HttpServletRequest request, @Context HttpServletResponse response) throws IOException {
Credential credential = initFlow().loadCredential("user");
Drive service = new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential).setApplicationName(APPLICATION_NAME).build();
String pageToken = savedPageToken;
while (pageToken != null) {
ChangeList changes = service.changes().list(pageToken).execute();
for (Change change : changes.getChanges()) {
Log.info("Change found for file: " + change.getFileId());
}
if (changes.getNewStartPageToken() != null) {
savedPageToken = changes.getNewStartPageToken();
}
pageToken = changes.getNewStartPageToken();
}
response.setStatus(200);
}
Este es el error:
Caused by: com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden
{
"code" : 403,
"errors" : [ {
"domain" : "usageLimits",
"message" : "User Rate Limit Exceeded",
"reason" : "userRateLimitExceeded"
} ],
"message" : "User Rate Limit Exceeded"
}
¿Por qué está pasando esto?
El error que ha encontrado se discutió en esta guía .
Acciones sugeridas:
- Aumente la cuota por usuario en el proyecto de Developer Console.
- Si un usuario realiza muchas solicitudes en nombre de muchos usuarios de un dominio de G Suite, considere una Cuenta de servicio con delegación de autoridad (estableciendo el parámetro quotaUser).
- Use retroceso exponencial.
También puedes intentar visitar esta publicación de SO para asuntos relacionados.
Hubo un error en el código. Tuve que cambiar lo siguiente:
PageToken = changes.getNewStartPageToken();
a
pageToken = changes.getNextPageToken();
La gran cantidad de consultas se debía a que estaba solicitando en cada ciclo un nuevo token de página de inicio, forzando un ciclo infinito.