繁体   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