Java RMIで問題が発生している可能性があります。私は "サーバー"オブジェクトと人 "クライアント"を持っています。どちらもRMIオブジェクトです(異なるリモートインタフェースに実装されています)。クライアントは自分自身をサーバーに登録し、リストに格納されます。サーバーは後でいくつかの作業をクライアントに配布し、結果を取得します。Java RMI - 共有状態が存在しない理由を理解できません
問題は、クライアントが保存されているリストは、であるとは思われません。(これ以上の説明はありません)。私。 1つのクライアントがサーバーインターフェイスを呼び出して自分自身を登録すると、それがリストに追加されますが、その呼び出しはローカルにしか見えません。続い
は、コードの最小の例である:
IRemote.java
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface IRemote extends Remote {
public void remoteCall() throws RemoteException;
}
RemoteImple.java
import java.io.Serializable;
import java.rmi.RemoteException;
import java.util.ArrayList;
public class RemoteImpl implements IRemote, Serializable {
public ArrayList<Integer> list = new ArrayList<Integer>();
@Override
public void remoteCall() throws RemoteException {
list.add(23);
System.out.println("In remote call: "+list.size());
}
}
RegAndServer.java
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class RegAndServer {
public static void main(String[] args) throws RemoteException, InterruptedException {
Registry reg = LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
RemoteImpl impl = new RemoteImpl();
reg.rebind("server", impl);
while(true) {
Thread.sleep(2000);
System.out.println("Server sees: "+impl.list.size());
}
}
}
Client.java
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
public class Client {
public static void main(String[] args) throws MalformedURLException, RemoteException, NotBoundException {
IRemote remote = (IRemote) Naming.lookup("//localhost/server");
remote.remoteCall();
}
}
私は、サーバーjava RegAndServer
を起動した場合には、出力 "サーバーは見ている:0" になるループで。私が今クライアントjava Client
を別のシェルで起動すると、 "In remote call:1"と表示されます。しかし、サーバープロセスは "Server sees:0"を出力します。
これはなぜですか?私は間違って何をしていますか?私は実際に私が変更するためのJava RMI :(
リストを 'RemoteImpl'ではなく' RegAndServer'に入れてそこから使うと、それは機能しますか?私はわからないが、 'RemoteImpl'オブジェクトが毎回生成されるようだ。 – Viruzzo
いいえ@Viruzzo、どちらもうまくいきません。 –