2016-10-27 24 views
0

如果您想在其RMI註冊表的特定端口上啓動jstatd,則可以爲此傳遞-p參數。如何強制或預測jstatd的第二個開放端口?

但問題是它打開第二個隨機端口(在java中稱爲「匿名端口」),這會導致編寫防火牆規則時出現問題,或者使用JVisualVM連接到在Docker容器中運行的遠程jstatd

如果你看看jstatd source,你會看到它打電話給UnicastRemoteObject.exportObject(remoteHost, 0),這將打開一個新的「匿名端口」,這似乎是隨機的。

有沒有辦法強制這個最後一個端口是固定的,還是一種方法來預測哪一個會被選中?

+0

可能的重複[如何確保RMI只使用特定的一組端口?](http://stackoverflow.com/questions/56687/how-do-i-ensure-that-rmi-uses-only -a-specific-set-of-ports) – jchampemont

+0

事實上,它會導致新導出的對象重用以前使用的端口,例如註冊表端口,除非存在套接字工廠衝突。你有證據嗎?還是僅僅基於這個誤讀這個問題? – EJP

+0

@EJP:我真的不理解你的評論......我的問題是基於這樣一個事實:當啓動'jstatd'時打開另一個端口(以及RMI註冊表端口),如果你不轉發這個端口在防火牆規則,然後JVisualVM(例如)將無法訪問此遠程服務器... –

回答

0

我發現沒有簡單的方法來預測使用匿名端口打開哪個具體端口。

但我發現所謂的「jakestatd」,這將迫使3個端口的jstatd重寫(因爲在最後,我發現,其實jstatd打開3個端口,而不是2作爲我首先想到),其jstatd用途。

由於這是不夠的,因爲我需要控制這些端口,我寫了ejstatd是回答這個確切的問題(以及其他),所以現在我可以使用(內ejstatd的文件夾)控制茨艾倫端口:

mvn exec:java -Dexec.args="-pr 2222 -ph 2223 -pv 2224" 

這裏將要開3個端口將222222232224和RMI註冊表將可在港2222