Как безопасно закрыть клиент RMI? - PullRequest
0 голосов
/ 11 января 2012

Я хочу закрыть все соединения между клиентом и сервером по протоколу RMI.

   Remote r=  Naming.lookup("rmi://192.168.105.38:9121/AccountRMIService");
   if(r instanceof RmiInvocationWrapper_Stub) {
       RmiInvocationWrapper_Stub stub = (RmiInvocationWrapper_Stub)r;
       System.out.println("hashCode="+stub.getRef().hashCode());
   }
   System.out.println(r);
   //How to close the connection with 'Remote' ?

Некоторый код для проверки состояния rmi сервера:

final ThreadLocal<List<Socket>> currentSocket = new ThreadLocal<List<Socket>>() {

    protected List<Socket> initialValue() {
        return new ArrayList<Socket>();
    }
};
RMISocketFactory.setSocketFactory(new RMISocketFactory() {

    public Socket createSocket(String host, int port) throws IOException {
        Socket socket = new Socket(host, port);
        socket.setKeepAlive(true);
        socket.setSoTimeout(300);
        currentSocket.get().add(socket);
        return socket;
    }

    public ServerSocket createServerSocket(int port) throws IOException {
        return new ServerSocket(port);
    }
});
Remote r = Naming.lookup("rmi://192.168.105.38:9121/AccountRMIService");
if (r instanceof RmiInvocationWrapper_Stub) {
    RmiInvocationWrapper_Stub stub = (RmiInvocationWrapper_Stub) r;
    System.out.println("hashCode=" + stub.getRef().hashCode());
}
Iterator<Socket> s = currentSocket.get().iterator();
while(s.hasNext()) {
    s.next().close();
    s.remove();
}

Это не клиент дляRMI общение.Я просто хочу проверить состояние сервера, используя протокол RMI, а не с простым сокетом.Иногда сервер все еще работает, но все запросы блокируются.

Ответы [ 3 ]

1 голос
/ 06 февраля 2012

Вы не можете «закрыть все соединения», потому что у вас нулевая видимость основного механизма TCP.Лучшее, что вы можете сделать в клиенте - разрешить сборку всех заглушек RMI.Базовые соединения все равно объединяются и закрываются довольно агрессивно.

0 голосов
/ 20 февраля 2019

Попробуйте отменить привязку (имя строки) Удаляет привязку для указанного имени в этом реестре. введите описание ссылки здесь

0 голосов
/ 11 января 2012

UnicastRemoteObject.unexportObject(Remote obj, boolean force) может помочь.

...