7

Я пытаюсь использовать GCM Network Manager для отправки журналов в бэкэнд-сервис. У нас есть будильник, который запускается каждый час, который создает OneoffTask, который при его выполнении вызовет бэкэнд-сервис с сообщением журнала.GCM Network Manager потерял работу

Это работает, НО очень большое количество Заданий теряется (путь более половины). Сначала я подумал, что это имеет какое-то отношение к нашему бэкенду или сети, но после добавления тонны регистрации файлов получается, что onRunTask в службе никогда не запускается для этих задач (но они определенно планируются. ? которые они потеряли ли я непонимание API, или OneoffTasks просто не надежен

Это как OneoffTask планируется:

GcmNetworkManager.getInstance(context).schedule(new OneoffTask.Builder() 
    .setService(AvroLogService.class) 
    .setExtras(bundle) 

    // A mandatory tag which identifies the task 
    // We add a unique hash to the tag to make sure that 
    // tasks are logged and not thrown away as dupes. 
    // See: http://stackoverflow.com/q/34528960/304262 
    .setTag(java.util.UUID.randomUUID().toString()) 

    // Persist to disk, even across boots: 
    .setPersisted(true) 

    // Sets a time frame for the execution of this task in seconds. 
    // This specifically means that the task can either be 
    // executed right now, or at latest at a certain point: 
    .setExecutionWindow(0, TWO_WEEKS_IN_SECONDS) 
    .build()); 

Опять же, это не работает, а только часть сообщений For. сообщения, которые впоследствии потеряны, приведенный выше код: определенно выполнено (я добавил регистрацию файла, чтобы проверить это), но никогда не существует соответствия nding onRunTask запущен для потерянных.

Я проверил, что:

  1. Manifest обновляется в соответствии с Руководство по внедрению Менеджер сети (https://developers.google.com/cloud-messaging/network-manager)
  2. AvroLogService (моя служба) расширяет GcmTaskService
  3. Он переопределяет onRunTask
  4. Приложение имеет RECEIVE_BOOT_COMPLETED.
  5. AvroLogService НЕ переопределяет onStartCommand.

Я потерян. Может ли кто-нибудь рассказать об этом?

+0

Возможно, вы захотите проверить это сообщение [GitHub post] (https://github.com/google/gcm/issues/67) для дополнительного идеи и примеры использования «GcmNetworkManager». Если вы этого еще не сделали, в сообщении упоминалось о необходимости обеспечить логику выполнения вашей задачи внутри 'onRunTask()', и вам нужно отслеживать состояние, которое вам нужно для этой конкретной задачи что ты хочешь. – Teyam

+0

Благодарим за попытку помочь, но этот пост не предоставил никаких существенных сведений для этой проблемы. В сообщении говорится о передаче данных в задачи, и я использую функцию setExtras (которая, похоже, не существовала, когда была написана запись), но это не имеет особого отношения к этой проблеме. Проблема в том, что код внутри onRunTask прерывается с ошибкой. То есть он выполняется много раз, но он также потеряет многие из поставленных задач. Это похоже на большой процент задач, которые просто теряются и никогда не достигают onRunTask, хотя они успешно поставлены в очередь. –

ответ

0

Как я думаю, ваша постоянная TWO_WEEKS_IN_SECONDS действительно означает 2 НЕДЕЛИ. В этом случае ваша задача может быть исполнена в любой момент времени до 2 WEEKS. Таким образом, эта задача не должна выполняться каждый час. Попробуйте установить окно выполнения в пределах одного часа или даже меньше (.setExecutionWindow(0, HALF_AN_HOUR_IN_SECONDS))

google api docs См

+0

Что произойдет, если задача не может выполнить за это время? –

+0

Из моего опыта. В большинстве случаев, когда условия не выполняются в этом окне, задача будет отложена, но я не могу найти официальных документов, чтобы доказать это. –

0

В ответ выше диапазона времени выполнения может быть в большой. Также я думаю, что вы хотите выполнить событие периодически, попробуйте использовать PeriodicTask.Builder вместо OneoffTask.Builder

+0

Да, PeriodicTask может быть хорошей заменой, но обратите внимание, что он не может быть выполнен во время Doze. –