Die GCM CCS Server-Implementierung empfängt keine Upstream-Nachrichten

8

Ich habe das neue GCM CCS für bidirektionale Nachrichten zwischen einer Android-Anwendung und einem Webserver implementiert. Downstream-Nachrichten (Web-Device) funktionieren einwandfrei. Leider werden Upstream-Nachrichten (Geräte-Web) nicht auf dem Server empfangen. Sie scheinen auf der Client-Seite gesendet zu werden (siehe Protokollmeldung der Android-App unten), aber auf dem Server wird nichts empfangen.

%Vor%

Ich gehe davon aus, dass auf der Android-Seite nichts falsch ist, sondern auf der Serverseite. Die Sache ist, ich kann nicht herausfinden, was falsch ist, weil die Verbindung noch am Leben ist und ich einige Nachrichten vom GCM-Server wie ACKs empfange. Warum werden normale Nachrichten nicht empfangen? Hat jemand eine Idee?

Einige weitere erwähnenswerte Details sind, dass der verwendete Webserver Glassfish ist und ich die XMPP-Verbindung in einem Servlet starte. Einige Schnipsel unten.

BEARBEITEN : Wie ich in der Antwort erklärt habe, wurde das Hauptproblem behoben, das verhinderte, dass eine Nachricht auf dem Server empfangen wurde. Es werden jedoch immer noch nicht viele Nachrichten empfangen (ca. 50%).

Zum Beispiel sende ich zwei Nachrichten sofort hintereinander in einem Hintergrund-Thread, jedes Mal, wenn ein Benutzer eine Änderung in der Android-App vornimmt (drückt eine Taste, so dass zwischen jedem Batch von 2 Sekunden ein paar Sekunden liegen) . Manchmal erhalte ich beide Nachrichten auf dem Server, manchmal erhalte ich nur eine davon, manchmal passiert gar nichts ... Dies ist ein ernstes Problem, besonders für Apps, die sich auf diese Technologie verlassen. Kann jemand weitere Hilfe leisten, um dies zu beheben?

Weitere Informationen : Ich bin mir ziemlich sicher, dass dies nicht clientbezogen ist, da jede Nachricht gesendet wird, wie Sie im logcat log oben sehen und ich auch erhalte die "event: sent" GCM Sendung nach einer Weile (nicht sofort, vielleicht wie 5 Minuten). Es muss also GCM-basiert oder serverbasiert sein.

%Vor%     
Bogdan Zurac 29.04.2014, 13:48
quelle

2 Antworten

6

Es scheint, dass die Webanwendung zweimal auf dem Server bereitgestellt wurde. Dies führte dazu, dass das Servlet, das die XMPP-Verbindung erstellt, einmal initialisiert, dann zerstört und dann erneut initialisiert wurde. Diese Sequenz war wahrscheinlich keine gute Sache für die Verbindung zu GCM (dho ..).

Stellen Sie nur sicher, dass das Servlet nur einmal initialisiert wird. Überprüfen Sie dies, indem Sie die Logger innerhalb der Methoden init () und destroy () verwenden. Wenn es tatsächlich mehrmals aufgerufen wird, versuchen Sie, das Webmodul einem bestimmten virtuellen Server für die Bereitstellung zuzuweisen. Ich glaube, das unterscheidet sich von Webserver zu Webserver. Für Glassfish müssen Sie dies über die Admin-Konsole (localhost: 4848) tun.

Dies löst das größere Problem. Ein anderes Problem, auf das ich stieß, war, dass die Upstream-Nachrichtenübermittlung überhaupt nicht zuverlässig war. Manchmal funktionierten mehrere aufeinanderfolgende Upstream-Nachrichten von demselben Gerät einwandfrei, nur um eine andere zu versuchen, die überhaupt nicht auf den Server gepusht wurde. Habe kein Muster für dieses Problem gefunden ... Ich werde zurückkommen, wenn ich etwas anderes finde.

BEARBEITEN : Offensichtlich gab es ein Problem, wenn die Implementierung auf einem lokalen Server verwendet wurde. Auf einen Remote-Server verschoben (Staging-VPS) und das Problem scheint verschwunden zu sein. Jede Nachricht wird vom Server empfangen. Ich werde zurück sein, wenn das Problem weiter besteht, aber ich bezweifle es. Ich nehme an, dass das lokale Problem entweder auf meinen ISP zurückzuführen war oder sogar auf meine lokale Wi-Fi-Verbindung. Ich habe keine vollständige Antwort darauf, was genau das verursacht hat, aber zumindest funktioniert es perfekt auf dem Staging-Server.

    
Bogdan Zurac 01.05.2014, 10:07
quelle
2

Ich schreibe hier eine andere Lösung, weil ich in derselben Sache feststeckte.

Ich habe eine einfache Android-App erstellt, die die GCM-API verwendet um Upstream-Nachrichten an den Server zu senden und Downstream-Nachrichten (Push-Nachrichten) vom Server zu empfangen.

Für die Server-Seite habe ich ein Java-Programm verwendet, das auf der akzeptierten Antwort auf diese Frage basiert ... GCM XMPP Server mit Smack 4.1.0 , der die Open Source Smack Java XMPP-Bibliothek verwendet .

Downstream-Messaging (Server zu Gerät) war felsenfest - nichts wurde fallen gelassen.

Aber nicht alle Upstream-Nachrichten wurden auf der Serverseite empfangen ... ca. 20-30% wurden gelöscht. Ich habe auch überprüft, mit Wireshark und die Pakete wurden definitiv nicht in die Netzwerkkarte auf der Serverseite kommen.

Das Problem in meinem Fall war mit dem Aufruf von gcm.send () in der Android App ... Die Nachrichten-ID-Zeichenfolge muss wirklich für jede Upstream-Nachricht eindeutig sein , während ich gerade einen konstanten Wert übergab.

Bei einer konstanten Nachrichten-ID führte dies dazu, dass Upstream-Nachrichten fehlschlugen, wenn ich versuchte, sie zu nahe aneinander zu senden, z. B. in einem Abstand von 250 ms. Wenn ich sie mit einem Abstand von 1000ms (1 Sekunde) oder mehr schickte, funktionierte es. Sehr schwierig, dieses Problem zu diagnostizieren, da es die meiste Zeit funktioniert hat.

    
dodgy_coder 28.10.2015 07:04
quelle