7

GCMネットワークマネージャを使用してバックエンドサービスにログを送信しようとしています。 OneofTaskを作成する毎時アラームが実行され、実行時にログメッセージとともにバックエンドサービスが呼び出されます。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. マニフェストは、Network Managerの実装ガイドに従って更新されるが(https://developers.google.com/cloud-messaging/network-manager)は
  2. AvroLogService(私のサービスは)
  3. それはonRunTask
  4. アプリが持っているよりも優先されますGcmTaskServiceを拡張しますRECEIVE_BOOT_COMPLETED権限。
  5. AvroLogServiceはonStartCommandをオーバーライドしません。

私は迷っています。誰かがこれについての洞察を共有することはできますか?

+0

この[GitHub投稿](https://github.com/google/gcm/issues/67)をチェックしてください'GcmNetworkManager'の使用に関する洞察と例を示します。もしあなたがそうしていなければ、 'onRunTask()'の中であなたのタスク実行のロジックを提供する必要があることがポストで言及されており、その特定のタスクが行うために必要な状態を把握しなければなりませんあなたが欲しいもの。 – Teyam

+0

ありがとうございましたが、その投稿はこの問題に関連する洞察を提供していませんでした。ポストはデータをタスクに渡すことについて話していますが、私はsetExtras機能を使用していますが(問題の投稿が書かれたときには存在しないようです)、この問題にはあまり関係ありません。 問題は、onRunTask内のコードが断続的に実行されないことです。私。それは何度も実行されますが、キューに入れられたタスクの多くも失われます。それは、たとえ成功したとしても、失われたタスクの大部分がonRunTaskに到達しないようなものです。 –

答えて

0

定数TWO_WEEKS_IN_SECONDSは実際には2週間を意味すると思います。この場合、タスクは今から2週間までの任意の時点で実行可能です。したがって、この作業は毎時間実行する必要はありません。

は、実行時間の範囲を超える答えとしてgoogle api docs

+0

その時間にタスクを実行できない場合はどうなりますか? –

+0

私の経験から、ほとんどの場合、その時に条件が満たされない場合、タスクは延期されますが、それを証明する正式な文書は見つかりません。 –

0

を見る(.setExecutionWindow(0, HALF_AN_HOUR_IN_SECONDS))を1時間またはそれ以下の範囲内で実行ウィンドウを設定するようにしてくださいすることは、大きなであることができます。また、イベントを定期的に実行したいと考えています.OneoffTask.Builderの代わりにPeriodicTask.Builderを使用してください。

+0

はい、PeriodicTaskは適切な代替方法ですが、Dozeの実行中に実行できないことに注意してください。 –

関連する問題