7

GCM 네트워크 관리자를 사용하여 로그를 백 아웃 서비스에 보내려고합니다. 실행될 때 로그 메시지로 백엔드 서비스를 호출하는 OneoffTask를 생성하는 매시간마다 경보가 발생합니다.GCM 네트워크 관리자 작업 손실

이 작업은 가능하지만 많은 양의 작업이 손실됩니다 (반 이상). 처음에는 백엔드 또는 네트워크와 관련이 있다고 생각했지만 파일 로깅을 추가하면 서비스의 onRunTask가 결코 이러한 작업에 대해 실행되지 않는다는 것을 알 수 있습니다. ?, 다시

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

이 들어 작동하지만 메시지의 일부가 아닌 :이 손실됩니다 내가 API를 오해하고 있는가, 또는 단순히 신뢰할 수있는 OneoffTasks을하지

이것은 OneoffTask가 예정되어 방법이다. 그 후에 분실되는 메시지는 위의 코드가 인데 분명히이 실행되었습니다 (이를 확인하기 위해 파일 로깅을 추가했습니다). 그러나 결코 해당 메시지가 없습니다. 잃어버린 것들에 대해 트리거 된 onRunTask를 지정하십시오.

내가 확인한 것을 :

  1. 매니페스트는 네트워크 관리자의 구현 가이드에 따라 업데이트됩니다 (https://developers.google.com/cloud-messaging/network-manager)는
  2. AvroLogService (내 서비스)
  3. 그것은 onRunTask
  4. 앱을 가지고 우선 GcmTaskService를 확장 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 주까지의 시점에서 실행에 적합합니다. 따라서이 작업은 매시간 실행하지 않아도됩니다. 한 시간 범위 내에서 실행 창을 설정하는 시도하거나 더 적은

(.setExecutionWindow(0, HALF_AN_HOUR_IN_SECONDS))

큰 일 수 있습니다 실행 시간 범위 위의 대답으로 google api docs

+0

그 시간에 작업을 실행할 수없는 경우 어떻게됩니까? –

+0

제 경험상, 대부분의 경우 조건이 충족되지 않는 경우 창 작업이 연기되지만 공식 문서를 찾을 수 없습니다. –

0

를 참조하십시오. 또한 나는 당신이 주기적으로 이벤트를 실행하기를 원한다고 생각합니다 .OneoffTask.Builder 대신 PeriodicTask.Builder를 사용하십시오.

+0

예, PeriodicTask를 대체 할 수는 있지만 Doze 중에는 실행되지 않을 수 있습니다. –