2011-01-12 76 views
1

場景:的Java EE/GlassFish的 - 線程和連接

我一直在使用Java SE相當長的一段時間,隨着螺紋等工作,雖然我使用Java EE的經驗。

我有一個連接到遠程服務器(在第三方公司)的第三方Java庫。該庫創建了幾個線程,並保持連接自己活着。 我不允許反覆打開新的連接(通過創建庫的新實例)。我需要保持圖書館的同一個實例,以便隨時保持連接。

這在Java SE應用程序中非常容易。

現在,我想創建一個Web服務(可能使用GlassFish或類似的)在我的公司內部使用,以便能夠使用它的連接功能。 換句話說,我需要一個自定義的遠程連接(不是由我的代碼創建或管理)在請求實例之間保持活動狀態。

問題: 這可能實現嗎?如果是這樣,我應該看看哪種技術?

+0

你的意思是數據庫連接? – 2011-01-12 12:51:10

+0

不,它是專有的第三方套接字連接。我不能使用JDBC或類似的東西。 – 2011-01-12 13:06:49

回答

2

你可以使用連接池做到這一點。當連接遠程服務器需要連接時,從該池中獲取連接,而不是每次都實例化。這將有助於保持更好的內存足跡和效率。如果連接不是如果使用時間更長,您可以將連接返回到池。

1

我最近實現了一個類似的系統,使用Tomcat作爲Servlet Container和Metro 2.0作爲JAX-WS實現。我的服務維護與後端組件(用C++實現)的套接字連接,並使用專有網絡協議與它們進行通信。

我使用'組件管理器'線程來管理與組件(連接建立,握手等)以及管理與組件的實際通信的'網絡選擇器'線程的高級通信。這個'網絡選擇器'使用異步非阻塞套接字使用Java Socket Selector類系列 - 使用單線程與套接字選擇器類交互是非常重要的一點,因爲一些Java平臺在使用多線程時會出現錯誤。

到目前爲止它工作得很好,所以我可以告訴你,這當然有可能。如果您需要任何澄清,然後請張貼在這裏或通過電子郵件發送給我(請參閱我的個人資料)。

+0

非常感謝您的快速回答!但是,我自己無法控制這些關係。專有庫正在創建線程並打開連接。實際上,這些線程似乎在請求實例之間保持運行,但我不確定如何在沒有序列化的情況下將引用分享給庫實例。 – 2011-01-12 13:20:30

+0

噢好吧 - 可能會更容易一些 - 也許您可能需要一個「管理器線程」來管理這些連接線程。關鍵是您需要在初始化期間創建一個線程,以獨立於請求/響應工作流來管理後端資源。 – trojanfoe 2011-01-12 13:27:09

0

您需要有一個工廠來維護連接,然後通過JNDI以與提供JDBC連接池相同的方式提供它。

然後您需要確保連接返回到所述工廠,然後將其集成到應用程序服務器生命週期中,以便以編程方式上下拉動連接。

請注意,如果你不小心,潛伏在這裏有一個討厭的類加載器問題。你將不得不爲工廠和客戶端提供一個公共類,如果它不是標準運行時庫中的一個,那麼你需要找出一種方法讓它正確共享,除非你想使用反射來獲取方法。