繁体   English   中英

如何在Java Server中从Apple Push Notifications Server可靠而有效地读取所有错误响应?

[英]How to reliably and efficiently read all error responses from Apple Push Notifications Server in a Java Server?

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

我注意到当我尝试向Apple发送无效消息(无效设备令牌,有效载荷太大等)时,可以在关闭套接字之前再发送几条消息。 当套接字关闭时,从Apple读取错误代码为时已晚,因此我不知道哪个消息是错误的消息(或者即使有错误的消息,因为Apple表示即使没有消息连接也会偶尔关闭)错误)。

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

如果您尝试以高频率(每秒说几百个)发送大量通知,则在每条消息等待Apple的响应后都无法停止(即使您仅等待20ms的响应时间)限制您每秒发送50条消息,并且您无法知道Apple编写错误响应将花费多长时间,因此短暂的等待可能不够。 如果您不停地阅读每条消息后可能出现的错误,则可能会在向Apple发送消息的过程中关闭连接,否则您将无法获得导致连接关闭的消息的ID。 。

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

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

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

我遇到了与您相同的问题。 我尝试了两种方法,但是在关闭连接之前,没有一种方法可以可靠地读取Apple的错误响应:

  1. 对于每个套接字,我启动了两个线程,一个用于连续写入,另一个用于阻止读取。 在大多数情况下,当写入遇到“套接字损坏”异常时,读取线程可以读取错误响应,但它并不完全可靠。
  2. 对于每个套接字,我只启动了一个线程来连续写入,并且遇到异常时,在try缓存块中尝试读取错误响应。 在大多数情况下,套接字是关闭的,所以我只读了一个异常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM