簡體   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