gpt4 book ai didi

java - 向 gcm 主题发送消息

转载 作者:行者123 更新时间:2023-12-01 09:33:25 25 4
gpt4 key购买 nike

我正在尝试向某个主题发送消息,但由于某种原因,消息需要很长时间才能传递,有时我一次收到太多消息,我还注意到一些新消息到达在其他较旧的消息之前。

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 时的默认行为,就像您的情况一样。 Set the priority to high ,如果您希望有更大的机会立即传递消息。请注意,这可能会影响电池生命周期。我不能说在什么程度上,但警告是有原因的。

您也可能 set the time_to_live to 0 ,但你几乎没有保证,也没有重试。

第二,有一个问题恐怕很难解决,那就是订购。 FCM 不保证任何类型的订购、期限。

那么,你能做什么呢?首先,您可以在应用程序中创建某种缓冲区,它将等待消息接收一段时间,重新排序并将它们传递给逻辑。这意味着您应该在发送的每条消息中包含某种时间戳,或者在每条消息上包含某种全局计数器,以便您知道是否错过了一些消息(注意,此解决方案带有龙!)。其次,事实上,组织你的消息传递和逻辑,这样它对无序消息更有弹性。

最后,根据您的应用程序,也许您可​​以切换协议(protocol)。考虑诸如 MQTT、STOMP 甚至 Websockets 之类的东西。

总而言之,这不是一个小问题,但可以解决正常操作。如果您正在围绕此构建真正关键任务的东西,祝您好运。

关于java - 向 gcm 主题发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39209112/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com