Как заменить сервер RMI на другой сервер RMI, использующий то же соединение? - PullRequest
0 голосов
/ 22 октября 2019

Я работаю над проектом, в котором у меня есть n клиентов, подключенных к серверу RMI (основной сервер RMI). К этому серверу подключен другой сервер, который называется Резервным сервером RMI. Предполагается, что сервер резервного копирования принимает на себя роль Первичного сервера RMI, когда он выходит из строя / выключается (например, CTRL + C), становясь Первичным сервером RMI.

Чтобы сохранить соединение между клиентами исервер без необходимости все заново подключать или снова выполнять поиск клиента ( Naming.lookup ) для сервера. Существует ли способ передачи соединения между первым сервером и другим?

Я уже пытался использовать LocateRegistry.getRegistry (PORT) на сервере резервного копирования, на том же порту, который используется в LocateRegistry.createRegistry (PORT) .rebind (RMINAME, это при создании «RMI-соединения» (я знаю, что это не -соединение как сокет, а просто для простоты). Не сработало, или, по крайней мере, я не был уверен, что его используют правильно.

Класс сервера RMI

try {
// First try to connect to Primary server (the case where this is 
//supposed to be Backup server)
    ci = (RMIInterface) Naming.lookup("RMIConnection");
// This function is what makes the Backup server aware that the Primary
// server failed. It's a while(true) loop with a Thread.sleep(2000)
// that invokes a simple RMI method to test the connection
   checkPrimaryServerStatus();
} 
catch (java.rmi.ConnectException e) {
       System.out.println("No primary RMIServer yet. Connecting...");
} finally {
     // If it isn't backup server, creates connection
         if (!isBackup) {
             try {
              LocateRegistry.createRegistry(RMIPORT).rebind(RMINAME, this);
             } catch (Exception err) {
                 System.out.println("\nERROR: Something went wrong. Aborting program...");
                 err.printStackTrace();
                 System.exit(-1);
             }
        }
}

Класс клиента RMI

try {
    ci = (RMIInterface) Naming.lookup("RMIConnection");
} catch (java.rmi.ConnectException e) {
    System.out.println("\nConnect the server first.");
    System.exit(-1);
}

Это создает основной и резервный серверы должным образомОднако если основной сервер отключен и резервное копирование вступает во владение, пользователи не могут взаимодействовать с резервной копией, как они могли бы с основным. Проблема заключается в «передаче» соединения от одного к другому.

...