7

Próbuję użyć Menedżera sieci GCM do wysyłania dzienników do usługi backendu. Mamy alarm o każdej godzinie, który tworzy OneoffTask, który po uruchomieniu wywoła usługę backendu z komunikatem dziennika.Menedżer sieci GCM tracąc zadania

To działa, ale bardzo duża ilość zadań jest tracona (o ponad połowę). Na początku myślałem, że ma to coś wspólnego z naszym zapleczem lub siecią, ale po dodaniu mnóstwa rejestrowania plików, okazuje się, że onRunTask w usłudze nigdy nie jest uruchamiany dla tych zadań (ale na pewno planowane są. ? są one utracone jestem nieporozumienie API, czy OneoffTasks prostu nie wiarygodne

ten sposób OneoffTask zaplanowano:

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()); 

Znowu nie działa, ale tylko część wiadomości dla. wiadomości, które są następnie utracone, powyższy kod jest definitywnie wykonany (dodałem rejestrowanie plików, aby to zweryfikować), ale nigdy nie ma correspo nding onRunTask wywołany dla utraconych.

I sprawdzeniu, że:

  1. Oczywisty jest aktualizowany zgodnie z realizacją Menedżer Guide Network (https://developers.google.com/cloud-messaging/network-manager)
  2. AvroLogService (mój serwis) rozciąga GcmTaskService
  3. To nadpisuje onRunTask
  4. Aplikacja ma Uprawnienie RECEIVE_BOOT_COMPLETED.
  5. AvroLogService NIE nadpisuje onStartCommand.

Zgubiłem się. Czy ktoś może podzielić się spostrzeżeniami na ten temat?

+0

Możesz sprawdzić to [post GitHub] (https://github.com/google/gcm/issues/67), aby uzyskać dodatkowe spostrzeżenia i przykłady użycia 'GcmNetworkManager'. Jeśli tego nie zrobiłeś, wspomniano w poście o potrzebie podania logiki do wykonania zadania wewnątrz 'onRunTask()' i musisz śledzić stan, który jest ci potrzebny do wykonania określonego zadania czego chcesz. – Teyam

+0

Dziękujemy za pomoc, ale ten wpis nie zawiera żadnych istotnych informacji na ten temat. Post mówi o przekazywaniu danych do zadań i korzystam z funkcji setExtras (która wydawała się nie istnieć po napisaniu danego posta), ale nie jest tak istotna dla tego problemu. Problem polega na tym, że kod wewnątrz funkcji onRunTask nie jest wykonywany z przerwami. To znaczy. jest wykonywany wiele razy, ale traci także wiele zadań w kolejce. To tak, jak duży procent zadań jest po prostu tracony i nigdy nie osiąga onRunTask, mimo że są one z powodzeniem umieszczane w kolejce. –

Odpowiedz

0

Jak sądzę, twoja stała TWO_WEEKS_IN_SECONDS naprawdę oznacza 2 TYGODNIE. W tym przypadku zadanie kwalifikuje się do wykonania w dowolnym momencie od teraz do 2 TYGODNIA. Zadanie to nie musi być wykonywane co godzinę. Spróbuj ustawić okno wykonania w zakresie jednej godziny lub nawet mniej (.setExecutionWindow(0, HALF_AN_HOUR_IN_SECONDS))

Zobacz google api docs

+0

Co się stanie, jeśli zadanie nie zostanie wykonane w tym czasie? –

+0

Z mojego doświadczenia wynika, że ​​w większości przypadków, gdy warunki nie zostaną spełnione w tym czasie, okno zadania zostanie przełożone, ale nie mogę znaleźć żadnych oficjalnych dokumentów, które by to udowodniły. –

0

W odpowiedzi powyżej wykonania przedziale czasowym może być zbyt duża. Myślę również, że chcesz wykonywać zdarzenie okresowo spróbuj użyć PeriodicTask.Builder zamiastOneoffTask.Builder

+0

Tak, PeriodicTask może być dobrym zamiennikiem, ale należy zauważyć, że nie można go wykonać podczas drzemki. –