2016-08-29 19 views
0

メッセージをいくつかのトピックに送信しようとしていますが、何らかの理由でメッセージが配信されるのに時間がかかり、一度にたくさんのメッセージを受信すると、新しいメッセージのうち、他の古いメッセージの前に到着します。gcmトピックにメッセージを送信

pubSub.subscribe(token, "/topics/" + topic, null); 

メッセージ送信するためのコード:

JSONObject jsonGcmData = new JSONObject(); 
JSONObject jsonData = new JSONObject(); 
jsonData.put("message", message); 

if (topic != null) 
{ 
    jsonGcmData.put("to", "/topics/" + topic); 
} 
else 
{ 
    // TODO: handle this 
    jsonGcmData.put("to", "/topics/Fail"); 
} 

jsonGcmData.put("data", jsonData); 

URL url = new URL("https://android.googleapis.com/gcm/send"); 
HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
conn.setRequestProperty("Authorization", "key=" + API_KEY); 
conn.setRequestProperty("Content-Type", "application/json"); 
conn.setRequestMethod("POST"); 
conn.setDoOutput(true); 

OutputStream outputStream = conn.getOutputStream(); 
outputStream.write(jsonGcmData.toString().getBytes()); 

InputStream inputStream = conn.getInputStream(); 

答えて

1

をあなたが直面している問題に貢献物事のカップルがあります。

新しいアプリを開発する場合は、Firebase Cloud Messagingを使用する必要があります。これは、Google Cloud Messagingに代わるものです。それはまだシャットダウンされませんが、なぜあなたはいつか悪い状況に身を置きます。それにもかかわらず、バージョンはおそらく原因ではありません。

まず、GCM/FCMメッセージは即時ではないことがわかります。リアルタイム性は何を考慮しているのかによって異なりますが、一般的にはいくつかの潜在性があり、エネルギー、バンド幅、CPU時間などを節約するためにグループ化することができます。あなたの場合のように、prioritynormalに設定されているときのデフォルトの動作です。 Set the priority to high、メッセージがすぐに配信される可能性が高い場合は、これはバッテリ寿命に影響する可能性があることに注意してください。どちらの程度では言えないのですが、警告は理由によってそこにあります。

また、set the time_to_live to 0でもかまいませんが、ほとんど保証や再試行はありません。

第2に、私はあなたが簡単に解決できないことを懸念しており、発注しています。 FCMはいかなる種類の注文、期間も保証しません。

あなたは何をすればよいですか?まず、アプリケーション内にバッファを作成して、メッセージが受信され、並べ替えられ、ロジックに渡されるまで待ちます。つまり、送信時に各メッセージに何らかの種類のタイムスタンプを含めるか、各メッセージに何らかのグローバルカウンタを含める必要がありますので、いくつか見逃してしまったかどうかを知ることができます(このソリューションにはドラゴンが搭載されています)。第2に、実際のメッセージングとロジックを整理します。そのため、メッセージの順序が間違っていれば回復しやすくなります。

最後に、アプリケーションによっては、プロトコルを切り替えることができます。 MQTT、STOMP、さらにはWebSocketのようなものを考えてみましょう。

まったく問題ではありませんが、通常の操作で解決することは可能です。あなたは本当にこの周りのミッションクリティカルな何かを構築している場合は、幸運。

関連する問題