2015-05-22 58 views
0

UPDATE 看來,在org.glassfish.tyrus.core.BaseContainer在構造函數中,這兩條線運行超慢:我的WebSocket需要永遠連接

this.managedExecutorService = lookupManagedExecutorService(); 
this.managedScheduledExecutorService = lookupManagedScheduledExecutorService(); 

什麼是交易在這兩種方法的評論中提到了Android,我是否使用了針對桌面的Java錯誤代碼?


我使用的代碼完全,因爲它是由:

Tyrus Websocket Documentation: 1.1.2 Client Endpoint

不知怎的,它在這條線大約需要10秒時間來連接,特別是當我運行Eclipse的調試器:

ClientManager client = ClientManager.createClient(); 

它可能與此有關嗎? Potentially similar Stack Overflow Question

我真的迷失了,我覺得我是一個罕見的異常者,試圖使用帶有Java客戶端的websockets而不是帶有Javascript的瀏覽器。

+0

記住在調試模式下運行可能會減慢速度;優化可能不是最難的,垃圾回收等。 –

+1

嘗試Tyrus 1.10。 #createClient不應該花費大量的時間,#connectToServer可能(服務器/網絡問題) –

+0

@Pavel,我正在使用tyrus-standalone-client-1.10.jar – smuggledPancakes

回答

1

所以問題的原因是由Tyrus初始化一個InitialContext爲了重用(預定的)執行器服務(如果有的話)。通常情況下,如果沒有可用的快速失敗(這將記錄爲調試消息,請參閱更多內容),但在這種情況下,只有在嘗試初始化無法工作的INITIAL_CONTEXT_FACTORY後纔會失敗。要覆蓋此行爲,請在創建客戶端之前撥打
System.setProperty(javax.naming.InitialContext.INITIAL_CONTEXT_FACTORY, "javax.naming.spi.InitialContextFactory")
。初始的InitialContext然後會嘗試創建一個接口的實例,並且這個失敗很快。

這些問題很可能在之前的詳細日誌中找到。 Tyrus不會做很多(調試)日誌記錄,但在這種情況下,使用jul over logback的設置可能會顯示出潛在問題的早期跡象。作爲一般規則:始終確保在遇到奇怪問題時可以查看跟蹤/調試日誌記錄。

至於源代碼中的Android註釋:這只是與「JDK8 compact2配置文件」的不兼容性被注意到的平臺,並且通過不直接導入javax.naming.InitialContext類來解決(因爲顯然它不存在於compact2配置文件),但使用反射代替(另請參閱TYRUS-242)。

如果您要創建純粹的Java Websocket客戶端,請考慮使用JDK 7 client。 JDK 7客戶端軟件包(org.glassfish.tyrus:tyrus-container-jdk-client:1.10)比默認軟件包(org.glassfish.tyrus.bundles:tyrus-standalone-client:1.10)小得多。

當我開始使用帶有Java客戶端的websockets(我選擇Jetty websocket client API實現)時,我也覺得我是一個離羣值。我也開始使用嵌入更多的Tomcat(例如basic-jsp-embed)。當結合這些技術時,你會得到一個強大的(「全雙工」)網絡解決方案(更類似於對等而不是客戶端 - 服務器)。希望它會迎頭趕上。
需要記住的一點是,有些防火牆會在30分鐘後(即使連接正在使用中)斷開連接(看起來像http連接)。因此,爲了獲得穩定的連接,請確保客戶端定期發送ping消息以確保連接健康,並在每30分鐘內創建一個新連接。