gpt4 book ai didi

java - 如何在 Java 服务器中可靠且高效地读取来自 Apple Push Notifications Server 的所有错误响应?

转载 作者:行者123 更新时间:2023-12-01 05:10:45 24 4
gpt4 key购买 nike

我正在研究 Java 中 Apple 推送通知的服务器端开发。我正在使用增强格式,以便检测失败的消息并重新发送错误消息之后的消息。我知道 Apple 不保证推送通知的发送,但我希望能够知道 Apple 是否收到了我的消息以及其中是否包含任何错误。

我注意到,当我尝试向 Apple 发送无效消息(无效设备 token 、负载过大等)时,我可以在套接字关闭之前再发送几条消息。当套接字关闭时,从Apple读取错误代码已经太晚了,所以我不知道哪条消息是坏消息(或者即使有坏消息,因为Apple说连接可能偶尔会关闭,即使没有错误)。

我在 JavaPN 源代码中看到的处理此问题的方法是在发送每条消息(或一组消息)后立即读取 Apple 的响应。如果频繁执行,则从套接字读取,并等待超时,以防没有任何内容可读取。如果您不经常发送推送通知,这是可以接受的。

如果您尝试以高频率发送大量通知(假设每秒数百个),则您无法在每条消息后停下来等待 Apple 的响应(即使您只等待响应 20 毫秒) ,这会将您限制为每秒 50 条消息,并且您无法知道 Apple 需要多长时间才能写入错误响应,因此短暂的等待可能还不够)。如果您在每条消息后不停下来阅读可能出现的错误,则在向 Apple 发送消息期间,您的连接可能会被关闭,在这种情况下,您将无法获取导致连接关闭的消息的 ID .

我正在考虑的另一种方法是在单独的线程中执行读取和写入。这样我就有更好的机会从 Apple 获取错误消息(在连接关闭之前),而不会影响向 Apple 发送消息的速度。这种方法在编程上更加复杂,并且由于我的服务器预计将 APN 发送到多个 iOS 应用程序,每个应用程序都需要自己的套接字和读取器/写入器线程,这将使我需要的线程数增加两倍。

上述 APN 服务器的所有行为都是在尝试向 Apple 沙箱服务器发送推送通知时了解到的。我不确定 Apple 生产服务器的行为是否更好,并且我不确定在生产服务器上执行测试是个好主意。

我的问题 - 有没有一种方法可以在关闭连接之前可靠地读取 Alpha 的错误响应,而不牺牲性能?在服务器关闭套接字后是否可以以某种方式从套接字读取输入?

最佳答案

我也遇到了和你一样的问题。我尝试了两种方法,但在关闭连接之前,它们都无法可靠地读取 Apple 的错误响应:

  1. 对于每个套接字,我启动了两个线程,一个用于连续写入,另一个用于阻塞读取。大多数情况下,当写入遇到“Socket Broken”异常时,读取线程可以读取到错误响应,但这并不完全可靠。
  2. 对于每个socket,我只启动一个线程连续写入,当遇到异常时,在try缓存 block 中尝试读取错误响应。在大多数情况下,套接字是关闭的,所以我除了异常之外什么也没读到。

关于java - 如何在 Java 服务器中可靠且高效地读取来自 Apple Push Notifications Server 的所有错误响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12059865/

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