我工作的一個應用程序,它具有以下結構RMI java.rmi.NoSuchObjectException和端口重用重併發
應用設計:
- 一臺機器說MACHINE1已運行6級不同的JVM。每個JVM都在其中運行APP1。因此,總共MACHINE1有6個並行執行的Java應用程序APP1
- 另一臺機器MACHINE2運行單個JVM,其中應用程序APP2正在運行。
- APP2具有不同類型的JAVA服務庫,例如Service1,Service2和service3等。如果MACHINE1的任何APP1想要執行Service1,則它將調用APP2的相同實例並傳遞請求對象。 APP2讀取Request對象,並在此基礎上調用請求的服務並將結果返回給APP1。
APP2的服務以APP1的XML文件形式使用輸入數據。所以我們將APP1的數據以文件形式傳輸到APP2 InputStream
APP1和APP2正在使用RMI進行通信。 APP2的服務對APP1 xml文件執行操作以生成結果。要將數據從APP1發送到APP2,我們選擇一個MACHINE1的端口並導出輸入流的遠程對象。在Machine1中,我們正在維護引用端口的整數POOL。 APP1從池中挑選一個端口整數並導出inputStream(我們已經創建了RMIInputStream)。
問題:
當我們執行較少的併發應用程序,然後它工作得很好。但是,當我們增加併發性時,我們開始接收異常 「java.rmi.NoSuchObjectException:表中沒有這樣的對象」 當我們從RemoteInputStream中讀取數據時會出現此異常。
我試圖解決這個問題,並專注於RemoteInputStream對象。我見過很多關於遠程對象的弱引用的迴應。我已經看到它,並發現在我的情況下,參考並不薄弱。
我也修改了dfc屬性,增加了租賃價值,但在我的情況下沒有效果。
我觀察這個問題:
在測試過程中我發現,如果所有端口使用單一的時間每一件事工作正常。假設如果我在池中分配20個端口比在前20次中不會發生任何異常。當我第二次開始使用相同的端口時,我會得到例外。如果我將端口數從20增加到600,那麼我將不會在前600次得到例外。看起來有一些問題與端口重用有關。 我已經添加了1分鐘的等待時間,然後將端口整數發送回池。在這種情況下,我的問題急劇減少。
所以我的結論是,如果我在MACHINE1的端口中輸出一個輸入流對象,那麼55800和MACHINE2會快速讀取它,並且APP1不導出數據並再次嘗試導出另一個遠程輸入流對象,則會產生問題。
我需要你所有的專家對我的問題的看法。這個問題與TCP/IP協議有關嗎?我是否試圖重用在TCP/IP生命週期方面仍然活躍的相同端口?
有沒有什麼好的方法來處理這個問題,而不是引入等待返回端口。
在MACHINE1的生產環境中,我們已經分配了一定範圍的Ports整數。我們的應用程序只允許使用此範圍內的端口。防火牆對此特定範圍的端口是開放的。因此,當我們想要導出inputStream時,我們必須確保數據應該導出到允許的端口範圍內。所以我們使用下面的代碼
UnicastRemoteObject.exportObject(remoteInputStreamObj, portNo.intValue());
爲此,我們開發了一個POOL來維護自由端口的整數。如果在APP1中創建的新線程具有3個應在APP2上處理的XML文件,則APP1將創建一個請求對象並創建新的三個RemoteInputStream對象。在創建對象3端口時,整數將從池中移除。一旦請求在APP2端得到處理並且APP1得到結果,那麼APP1將不導出對象並將Ports整數返回到POOL。
這裏Ports POOL是指維護自由端口整數的整數池。此池並不意味着RemoteInputStream對象池。我們每次創建RemoteInputStream的新實例。在MACHINE1中,儘管有6個JVM正在運行,但我們還有另一個第7個JVM,它維護Port POOL的單例引用。所以一個POOL實例被所有其他APP1 JVM共享。
在我們的案例中,我們有很高的併發性。除併發之外,APP1的一個請求可以有多個XML。在少數情況下,單個請求中可能有25-30個文件需要由MACHINE2 APP2同時讀取。在這種情況下,我們需要創建25-30個RemoteInputStream對象實例並將其放入請求對象中。所以在這裏我們一次需要更多的端口。
在實際的生產環境中,可能會發生50個線程的Service1可以同時執行,每個請求對象可能有2-3個XML文件,其inputStream對象需要導出。在這種情況下,我們需要多個端口。
您的問題可以編輯得很好,有益。大部分是無關緊要的。當你在這時,將所有尖叫的'POOL'改爲'pool'。 – EJP
謝謝@ejp先生。我將總結並嘗試使這個問題更相關。 –