2011-12-05 39 views
6

Tôi đang làm việc trên Java RMI. Tôi có vấn đề nhỏ với chạy rmiregistry của tôi trên cổng 2028 như tôi allready sử dụng một để chạy chương trình thử nghiệm của tôi. Tôi có thể chạy chương trình của tôi bằng cách sử dụng cổng khác nhưng tôi muốn biết, Làm thế nào chúng ta có thể đóng rmiregistry chạy trên cổng perticular?Làm thế nào để đóng rmiregistry chạy trên cổng cụ thể?

+0

Bạn có bắt đầu rmiregistry theo cách lập trình hoặc thủ công như một quy trình riêng biệt không? – Tudor

+0

No. Tôi đang khởi động Linux shell như sau% rmiregistry 2028 & – slonkar

+0

Nếu bạn khởi động nó theo cách thủ công, bạn cũng không thể dừng nó theo cách thủ công? – Tudor

Trả lời

9

Nếu bạn muốn làm điều này trong chương trình, chúng tôi làm điều gì đó như:

// 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); 
} 

Đây là full code for our JMXServer class. Chúng tôi gặp sự cố khi tạo 2 trong số này và hoàn toàn hủy đăng ký chúng để chúng tôi đảm bảo chạy thử nghiệm đơn vị trên các cổng khác nhau.

Tôi sử dụng mã này trong gói dịch vụ/khách hàng JMX SimpleJmx JMX của mình.

+0

Tôi bắt đầu rmiregistry từ vỏ. Không sử dụng nó thông qua chương trình. – slonkar

+1

Tôi đã gặp một vấn đề tương tự trong Eclipse, nơi mà chuỗi đăng ký sẽ tiếp tục chạy mãi mãi với các đoạn mã ở trên. Thêm System.exit (0) để kết thúc, mà giết tất cả các chủ đề trong JVM, và tất cả kết thúc tốt ;-) –

+0

+1 Tôi đã ngừng kết nối nhưng không thể làm việc ra làm thế nào để thoát khỏi ổ cắm máy chủ của registry. Cảm ơn câu trả lời. – dannrob

1

Nếu bạn đang chạy rmiregistry từ vỏ cố gắng để đóng nó với:

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

Tôi không rất tươi với các lệnh shell, nhưng tôi hy vọng bạn sẽ có được ý tưởng.

+0

Tôi đoán từ trình bao, tôi sẽ phải sử dụng ps -ef | grep rmiregistry. Tôi vẫn chưa thử nó lần nào. Nhưng tôi chắc chắn sẽ cho bạn biết. Cảm ơn. – slonkar

+0

@ Tudor: Xin lỗi người đàn ông nó đã không làm việc ... Nhưng tôi đã tìm thấy câu trả lời để làm như vậy. – slonkar

6

Sau rất nhiều rắc rối, tôi đột nhiên nhận ra rằng rmiregistry chạy trong nền vỏ. Vì vậy, tất cả chúng ta phải đóng nó trước tiên mang nó đến nền trước và sau đó đóng nó lại. Va no đa hoạt động.

BTW để đưa nó vào foreground chỉ loại:

% fg 

và sau đó đóng nó lại gõ:

Ctrl + c

Vậy là xong. Cảm ơn rất nhiều người đã cố gắng giúp tôi.

1

Nếu sổ đăng ký rmi đã sử dụng cổng và bạn muốn rebind dịch vụ mà không cần sử dụng cổng khác. Bạn có thể thử mã bên dưới

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); 
} 
Các vấn đề liên quan