我正在通過Java RMI編寫分佈式應用程序。 RMI客戶端向RMI服務器註冊事件處理程序/回調,服務器在需要時調用客戶端的回調函數。現在的問題是,當網絡連接失敗(例如,以太網電纜被拔出......)時,RMI服務器和客戶端將不會得到通知,並且當嘗試調用客戶端的註冊回調函數時,RMI服務器將失敗。RMI服務器也不能通知RMI客戶端這個問題。更糟糕的是,當網絡連接恢復時,RMI客戶端服務仍然會與RMI服務器失去聯繫,因爲沒有人通知她重新連接。回調時RMI連接失敗檢測
我目前的想法是在單獨的線程中的RMI客戶端實現一個ping()方法。 此線程可以定期喚醒並檢查服務器。 如果失敗,那麼鬧劇重新連接。
其他優雅的解決方案?希望你們能幫忙!
接口
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface MyInterface extends Remote {
public int RegisterEventHandler(RemoteMyEventHandler eventHandler) throws RemoteException;
public void unRegisterEventHandler(int eventHandlerId) throws RemoteException;
}
RMI服務器impelementation
import java.rmi.RemoteException;
import com.me.MyInterface;
public class MyInterfaceImpl implements MyInterface {
{
public void init() {
try {
//... initialize RMI server....
//....
} catch (Exception ex) {
ex.printStackTrace();
}
}
@Override
public int RegisterEventHandler(RemoteMyEventHandler eventHandler)
throws RemoteException {
return MyEventHandlerImp.getInstance().addHandler(eventHandler);
}
@Override
public void unRegisterEventHandler(int eventHandlerId)
throws RemoteException {
MyEventHandlerImp.getInstance().removeHandler(eventHandlerId);
}
}
//handler.notifyEventSnap(events);
的RMI客戶端執行
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.util.Properties;
import org.apache.log4j.Logger;
import com.me.MyInterface;
public class MyService implements NotifyHandler{
{
private MyInterface client;
private MyEventHandler myEventHandler;
private void connectToServer() {
try {
//...
Registry registry = LocateRegistry.getRegistry(rmiHost, rmiPort);
client = (MyInterface) registry.lookup(MyCInterface.class.getName());
} catch (RemoteException er) {
} catch (NotBoundException en) {
} catch (Exception en) {
}
}
private void startService(){
//Attach my event handler
if(client != null)
{
myEventHandler = new MyEventHandler();
myEventHandlerId = client.RegisterEventHandler(myEventHandler);
}
}
}
你需要看的是RMI超時[post](http://stackoverflow.com/questions/1822695/java-rmi-client-timeout) – shazin
客戶端不必'聯繫服務器重新連接'網絡中斷後'。存根仍然有效,服務器只需再試一次。 – EJP
@EJP,你是什麼意思?正如我測試,客戶端必須再次撥打「registry.lookup ...」,否則RemoteException的將被拋出 – xoyoja