我正在尝试使用 GCM 网络管理器将日志发送到后端服务。我们大约每小时都会运行一个警报,它会创建一个 OneoffTask,在执行该任务时,它将使用日志消息调用后端服务。
这行得通,但是丢失了大量的任务(超过一半)。起初,我认为它与我们的后端或网络有关,但在添加了大量文件日志记录后,事实证明服务中的 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());
同样,这不起作用,而只是部分消息。对于随后丢失的消息,上面的代码 肯定会执行(我添加了文件日志来验证这一点),但从来没有为丢失的消息触发相应的 onRunTask。
我已经证实:
- 根据网络管理器实施指南 ( https://developers.google.com/cloud-messaging/network-manager )更新清单
- AvroLogService(我的服务)扩展了 GcmTaskService
- 它覆盖 onRunTask
- 该应用程序具有 RECEIVE_BOOT_COMPLETED 权限。
- AvroLogService 不会覆盖 onStartCommand。
我迷路了。有人可以分享对此的见解吗?