Я работаю над проектом, в котором у меня есть 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);
}
Это создает основной и резервный серверы должным образомОднако если основной сервер отключен и резервное копирование вступает во владение, пользователи не могут взаимодействовать с резервной копией, как они могли бы с основным. Проблема заключается в «передаче» соединения от одного к другому.