2016-08-29 3 views
0

Ich versuche, eine Nachricht zu einem Thema zu senden, aber aus irgendeinem Grund die Nachricht zu nehmen viel Zeit, um zu liefern, und manchmal bekomme ich zu viele Nachrichten auf einmal, bemerkte ich auch, dass einige der neuen Nachrichten kommen vor anderen älteren Nachrichten an.Nachricht an gcm senden Thema

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

Der Code zum Senden von Nachrichten:

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

Antwort

1

Es gibt ein paar Dinge, die Sie konfrontiert sind zu Fragen beitragen.

Vor allem, wenn Sie eine neue App entwickeln, sollten Sie Firebase Cloud Messaging verwenden, die Google Cloud Messaging ersetzt. Es wird noch nicht stillgelegt werden, aber warum bringst du dich eines Tages in eine schlimme Situation. Dennoch ist die Version wahrscheinlich nicht die Ursache.

Zuerst müssen Sie wissen, dass GCM/FCM Nachrichten nicht sofort sind. Es hängt davon ab, was Sie in Echtzeit denken, aber im Allgemeinen können sie etwas latent sein und sie können in Gruppen zusammengefasst werden, um Energie, Bandbreite, CPU-Zeit und so weiter zu sparen. Das ist das Standardverhalten, wenn der priority wie in Ihrem Fall auf normal gesetzt ist. Set the priority to high, wenn Sie eine größere Chance für die sofortige Lieferung der Nachricht wünschen. Seien Sie gewarnt, dass dies die Lebensdauer der Batterie beeinträchtigen könnte. Ich kann nicht sagen, in welchem ​​Grad, aber die Warnung gibt es aus einem Grund.

Sie könnten auch set the time_to_live to 0, aber als Sie haben fast keine Garantie und keine Wiederholungen.

Zweitens, ein Problem, ich fürchte, Sie können nicht einfach lösen, bestellen. FCM garantiert keine Art der Bestellung, Zeitraum.

Also, was können Sie tun? Zunächst können Sie in Ihrer Anwendung eine Art Puffer erstellen, der einige Zeit auf den Empfang von Nachrichten wartet, sie neu anordnet und sie durch die Logik leitet. Das bedeutet, dass Sie für jede Nachricht eine Art Zeitstempel mit jeder Nachricht oder eine Art globalen Zähler für jede Nachricht einfügen sollten, damit Sie wissen, ob Sie etwas verpasst haben (Vorsicht, diese Lösung trägt Drachen mit sich!). Zweitens, organisieren Sie Ihre Nachrichtenübermittlung und Logik als eine Tatsache, so dass es bei Out-of-Order-Nachrichten widerstandsfähiger ist.

Schließlich, abhängig von Ihrer Anwendung, können Sie vielleicht Protokolle wechseln. Betrachten Sie etwas wie MQTT, STOMP oder sogar Websockets.

Alles in allem kein triviales Problem, aber machbar für den Normalbetrieb zu lösen. Wenn Sie etwas wirklich Missionskritisches dabei bauen, viel Glück.

Verwandte Themen