使用 LocateRegistry.createRegistry(port) 創建 RMI Registry 監聽端口後,如何在程式中優雅關閉該端口?早期 JDK(~2003)此操作無效,JDK 6 修復(參考 Sun Bug 4457683、4508962 及相關郵件檔案)。核心方案:調用 java.rmi.server.UnicastRemoteObject.unexportObject(reg, true) 強制取消導出。
import java.rmi.NoSuchObjectException;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
public class RMITest {
public void testRMIPortRelease() {
System.out.println("Testing port release");
System.out.println("Acquiring port... ");
Remote reg = null;
try {
reg = LocateRegistry.createRegistry(1102);
} catch (RemoteException ex) {
ex.printStackTrace();
}
System.out.println("Releasing port... ");
try {
java.rmi.server.UnicastRemoteObject.unexportObject(reg, true);
} catch (NoSuchObjectException ex1) {
ex1.printStackTrace();
}
reg = null;
}
public static void main(String[] args) {
RMITest s = new RMITest();
s.testRMIPortRelease();
}
}
unexportObject(obj, true) 第二參數 true 表示強制取消導出,即使有活躍連接也會切斷reg = null 協助 GC 回收若遇端口釋放失效,請確認 JDK 版本 ≥ 6,並檢查是否有其他線程持有對 Registry 的強引用阻礙 GC。