このかなり単純な RMI 通信があります。
サーバ:
LocateRegistry.createRegistry(settings.rmiPort).bind("server", UnicastRemoteObject.exportObject(remoteMe, 0));
private final class RemoteLobbyServerImpl implements RemoteLobbyServer {
@Override public void registerRobotServer(RemoteRobotServer robotServer, int seq) throws RemoteException {
System.out.println(String.valueOf(seq));
// robotManager.setServer(robotServer);
}
}
クライアント:
final Registry registry = LocateRegistry.getRegistry(lobbyHost, lobbyRmiPort);
log.info("Looking up lobbyserver...");
remoteLobbyServer = (RemoteLobbyServer) registry.lookup("server");
log.info(remoteLobbyServer.toString());
remoteMe = new RemoteRobotServerImpl();
final int seq = (int)(Math.random() * 10);
log.info("Registering myself "+seq+" ...");
Future<?> registerTask = ThreadPool.submit(new Runnable() { @Override public void run() {
try {
remoteLobbyServer.registerRobotServer((RemoteRobotServer) UnicastRemoteObject.exportObject(remoteMe, 0), seq);
} catch (RemoteException e) {
throw new RuntimeException(e);
}
log.info("Registered");
}});
try {
registerTask.get(30, TimeUnit.SECONDS);
} catch (TimeoutException e) {
registerTask.cancel(true);
throw new RuntimeException("Registration timed out");
}
同じマシンで実行すると、これは正常に機能します。ただし、クライアントとサーバーの間にある程度の距離があると、バラバラになります。その後、サーバーが応答するまでに約 2 分かかります。
Linux の ping によると、レイテンシは 20 ミリ秒です。奇妙なことに、それが表示されるまでにはしばらく時間がかかりますが、たとえば ping google.com (これも 20 ミリ秒) ではかなり迅速に結果が得られます。
何が起きているのでしょうか?これをどのように分析できますか?