我试图向某个主题发送消息,但由于某种原因,消息需要花费大量时间才能发送,有时我会一次收到太多消息,我也注意到了一些新消息消息在其他旧消息之前到达。
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();
答案 0 :(得分:1)
有几件事情会导致您面临的问题。
首先,如果您正在开发新应用,则应使用Firebase Cloud Messaging取代Google Cloud Messaging。它还没有被关闭,但为什么有一天会把自己置于糟糕的境地。然而,版本可能不是原因。
首先,您必须知道GCM / FCM消息不是即时消息。这取决于你认为实时是什么,但一般来说它们可能有一些特性,它们可以分组分组以节省能量,带宽,CPU时间等等。这是priority
设置为normal
时的默认行为,如您的情况。 Set the priority to high,如果您希望更有可能立即传递消息。请注意,这可能会影响电池寿命。我不能说在哪个程度上,但警告是有原因的。
您可能也set the time_to_live
to 0,但几乎没有保证也没有重试。
其次,一个问题恐怕你不能轻易解决,订购。 FCM不保证任何类型的订购,期限。
那么,你能做什么?首先,您可以在应用程序中创建某种缓冲区,等待一段时间让消息接收,重新排序并通过逻辑传递它们。这意味着你应该在发送时包含某些时间戳,或在每条消息上包含某种全局计数器,这样你就知道你是否错过了一些(请注意,这个解决方案带有龙!)。其次,组织你的消息传递和逻辑,因此它对无序消息更具弹性。
最后,根据您的应用程序,您可以切换协议。考虑像MQTT,STOMP甚至websockets这样的东西。
总而言之,这不是一个微不足道的问题,但可以解决正常运作问题。如果你正在构建一些真正关键的任务,祝你好运。