42 lines
1.7 KiB
Diff
42 lines
1.7 KiB
Diff
--- a/src/org/droidtv/gel/gathering/GatheringService.java
|
|
+++ b/src/org/droidtv/gel/gathering/GatheringService.java
|
|
@@
|
|
- OneTimeWorkRequest request = GELWorker.buildWorkRequest(intent);
|
|
- workManager.enqueueUniqueWork("GEL_WORK",
|
|
- ExistingWorkPolicy.APPEND_OR_REPLACE, request);
|
|
+ eventOutbox.enqueue(EventRecord.from(intent), EventClassifier.forIntent(intent));
|
|
+ OneTimeWorkRequest request = new OneTimeWorkRequest.Builder(GELDrainWorker.class)
|
|
+ .keepResultsForAtLeast(10, TimeUnit.MINUTES).build();
|
|
+ workManager.enqueueUniqueWork("GEL_DRAIN", ExistingWorkPolicy.KEEP, request);
|
|
|
|
--- a/src/org/droidtv/gel/gathering/GELWorker.java
|
|
+++ b/src/org/droidtv/gel/gathering/GELDrainWorker.java
|
|
@@
|
|
- Intent intent = intentFromWorkData(getInputData());
|
|
- gatheringService.dispatch(intent);
|
|
- return Result.success();
|
|
+ long deadline = SystemClock.elapsedRealtime() + TimeUnit.MINUTES.toMillis(8);
|
|
+ while (SystemClock.elapsedRealtime() < deadline) {
|
|
+ EventRecord event = eventOutbox.peekOldest();
|
|
+ if (event == null) return Result.success();
|
|
+ gatheringService.dispatch(event.toIntent());
|
|
+ eventOutbox.ack(event.sequence); // acknowledge only after dispatch
|
|
+ }
|
|
+ return Result.retry();
|
|
|
|
--- /dev/null
|
|
+++ b/src/org/droidtv/gel/gathering/EventOutbox.sql
|
|
@@
|
|
+CREATE TABLE gel_event_outbox(
|
|
+ sequence INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
+ action TEXT NOT NULL,
|
|
+ payload BLOB NOT NULL,
|
|
+ coalesce_key TEXT UNIQUE,
|
|
+ created_ms INTEGER NOT NULL,
|
|
+ attempts INTEGER NOT NULL DEFAULT 0
|
|
+);
|
|
|
|
# Add a unique periodic GEL_DRAIN_WATCHDOG with KEEP. Bound the outbox to 4,096
|
|
# rows / 8 MiB, retain a dropped-event metric, and coalesce only action classes
|
|
# proven to be replaceable state/alarm snapshots.
|