我正在尝试使用GCM Network Manager将日志发送到后端服务。我们每隔一小时运行一次警报,创建一个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。
我已经确认:
我输了。有人可以分享这方面的见解吗?
答案 0 :(得分:0)
我猜你的常数<p>
实际上意味着2周。在这种情况下,您的任务有资格在任何时间点执行,从现在开始到2周。因此,这项任务不必每小时执行一次。
尝试将执行窗口设置为一小时甚至更短(TWO_WEEKS_IN_SECONDS
)
答案 1 :(得分:0)
作为上述答案,执行时间范围可能会很大。另外我认为你想要定期执行事件尝试使用PeriodicTask.Builder而不是OneoffTask.Builder