2011-12-05 72 views
6

我正在研究Java RMI。我在端口2028上運行我的rmiregistry時遇到了小問題,因爲我已經使用它來運行我的測試程序。我可以使用其他端口來運行我的程序,但我想知道,我們如何關閉運行在端口上的rmiregistry?如何關閉運行在特定端口上的rmiregistry?

+0

您是以編程方式或手動將rmiregistry作爲獨立進程啓動的嗎? – Tudor

+0

不,我正在啓動Linux shell,如下所示%rmiregistry 2028& – slonkar

+0

如果您是手動啓動它,難道您不能手動停止它嗎? – Tudor

回答

9

如果你想這樣做編程,我們做這樣的事情:

// create the registry 
Registry rmiRegistry = LocateRegistry.createRegistry(port); 
... 
// connect to it 
JMXConnectorServer connector = 
    JMXConnectorServerFactory.newJMXConnectorServer(url, 
     new HashMap<String, Object>(), 
     ManagementFactory.getPlatformMBeanServer()); 
// do stuff with it ... 

// close the connection 
if (connector != null) { 
    connector.stop(); 
} 
// deregister the registry 
if (rmiRegistry != null) { 
    UnicastRemoteObject.unexportObject(rmiRegistry, true); 
} 

這裏的full code for our JMXServer class。我們在創建其中的2個並完全取消註冊時遇到問題,因此我們確保在不同的端口上運行我們的單元測試。

我在我的SimpleJmx JMX客戶端/服務包中使用此代碼。

+0

我從shell啓動rmiregistry。不通過程序使用它。 – slonkar

+1

我在Eclipse中遇到類似的問題,註冊表線程只會使用上面的代碼片斷繼續運行。添加了System.exit(0)到最後,它終止了JVM中的所有線程,並且一切都結束了;-) –

+0

+1我停止了連接器,但無法解決如何擺脫註冊表的服務器套接字。感謝你的回答。 – dannrob

1

如果您正在從外殼rmiregistry的嘗試與關閉:

Process p = 
Runtime.getRuntime().exec("ps -ef | grep rmiregistry | awk '{ print $2 }' | kill -9"); 

我不是shell命令那麼新鮮,但我希望你的想法。

+0

我想從shell我將不得不使用ps -ef | grep rmiregistry。我還沒有嘗試過。但我一定會讓你知道的。謝謝。 – slonkar

+0

@都鐸:對不起,它沒有解決......但我確實找到了答案。 – slonkar

6

經過這麼多麻煩,我突然意識到rmiregistry運行在shell的背景下。因此,我們必須先關閉它,然後將其關閉,然後關閉它。它的工作。

BTW要拿前景只是類型:

% fg 

,然後將其關閉鍵入:

按Ctrl + C

就是這樣。非常感謝所有試圖幫助我的人。

1

如果rmi註冊表已經在使用該端口,並且您想要重新綁定服務而不使用其他端口。您可以嘗試下面的代碼

Registry registry = null; 
try { 
    registry = LocateRegistry.createRegistry(1099); 
} catch (ExportException ex) { 
    registry = LocateRegistry.getRegistry(1099); 
} catch (RemoteException ex) { 
    Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex); 
} 
相關問題