簡體   English   中英

向gcm主題發送消息

[英]Sending message to gcm topic

我正在嘗試向某個主題發送消息,但是由於某種原因,該消息要花很多時間才能發送,有時我一次收到太多消息,所以我還注意到一些新消息比其他舊消息先到達消息。

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

有幾件事會導致您面臨的問題。

首先,如果您要開發新的應用程序,則應使用Firebase Cloud Messaging ,它可以取代Google Cloud Messaging 它不會被關閉,但是為什么有一天會讓自己陷入困境。 但是,該版本可能不是原因。

首先,您必須知道GCM / FCM消息不是即時的。 這取決於您對實時性的考慮,但是通常它們可能會有一些延遲,並且可以將它們分為幾組以節省能量,帶寬,CPU時間等。 當您將priority設置為normal ,這是默認行為。 如果希望更大的機會立即發送郵件,請將優先級設置為high 請注意,這可能會影響電池壽命。 我不能說出什么程度,但是警告是有原因的。

您也可以time_to_live設置為0 ,但是幾乎沒有保證,也沒有重試。

其次,訂購一個恐怕無法解決的問題。 FCM不保證任何形式的訂購期限。

所以,你可以做什么? 首先,您可以在應用程序中創建某種緩沖區,該緩沖區將等待一段時間以接收消息,對消息重新排序並通過邏輯傳遞消息。 這意味着您應該在發送的每條消息中都包含某種時間戳,或者在每條消息中都包含某種全局計數器,以使您知道是否錯過了某些時間戳(請注意,此解決方案帶有龍!)。 第二,事實上,組織您的消息傳遞和邏輯,因此對於亂序消息,它更具彈性。

最后,根據您的應用程序,也許可以切換協議。 考慮類似MQTT,STOMP或websocket的東西。

總而言之,這不是一個簡單的問題,但可以解決正常操作。 如果您要為此構建真正關鍵的任務,那么祝您好運。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM