1

私は多くの場所で解決策を探しましたが、見つかりませんでした。

私の質問は、オフラインメソッドを定義する方法です。したがって、RMIサーバーからオブジェクトを取得した後、このメソッドを呼び出すことができ、サーバーからデータを取得せず、クライアント内のオブジェクトからデータを取得します。

具体的には、2つのメソッドと1つのプライベート変数を持つDatabaseクラスがあるとします。方法1:変数の値を返します(プロパティメソッド..)-クライアントのオブジェクトに変数が既にあるため、オフラインメソッドである必要があります。方法2:データベースに新しいデータを挿入します(sqlコマンド..)。-サーバーがデータベースに接続できるように、オンライン方式である必要があります。

どうもありがとう!

4

2 に答える 2

0

この機能が必要な場合は、代わりに JMS メッセージングを使用することをお勧めします。これにより、非同期メッセージをより効果的に管理できるからです。オプションで永続化されるキューとトピックもサポートします。

于 2012-12-04T12:09:46.040 に答える
0

そんなことはできません。デザインを調整する必要があります。幸いなことに、デザインをあまり調整する必要はないと思います。

重要なことは、すべてのオブジェクトがリモート オブジェクトかローカル オブジェクトかを判断できることです。リモート オブジェクトへの呼び出しはサーバーに送られますが、ローカル オブジェクトへの呼び出しはローカルのままです。両方になりたいオブジェクトが 1 つある場合は、それを 2 つに分割する必要があるため、ローカル部分とリモート部分があります。クライアントにとって便利なインターフェイスを維持するために、リモート オブジェクトをローカル オブジェクトの背後に隠すことができます。

これを行う方法のスケッチを次に示します。

public interface RemoteDatabase extends Remote {
    public void insertData(String data) throws RemoteException;
}

public class RemoteDatabaseImpl implements RemoteDatabase {
    @Override
    public void insertData(String data) throws RemoteException {
        // whatever
    }
}

public class Database implements Serializable {
    private final RemoteDatabase remote;
    private final String property;

    public Database(RemoteDatabase remote, String property) {
        this.remote = remote;
        this.property = property;
    }

    public String getProperty() {
        return property;
    }

    public void insertData(String data) throws RemoteException {
        remote.insertData(data);
    }
}

サーバー上に のインスタンスを作成するときは、実際のものではなく、実装用のスタブDatabaseを与える必要があることに注意してください(私はそう思います)。RemoteDatabaseImpl

オブジェクトの関係を強化するために、これらに同じインターフェースを実装させることもできます。このようなもの:

public interface RemoteDatabase extends Remote {
    public String getProperty() throws RemoteException;
    public void insertData(String data) throws RemoteException;
}

public class RemoteDatabaseImpl implements RemoteDatabase {
    @Override
    public void insertData(String data) throws RemoteException {
        // whatever
    }

    @Override
    public String getProperty() {
        return "whatever";
    }

    public Database toLocal() throws NoSuchObjectException {
        return new Database((RemoteDatabase) PortableRemoteObject.toStub(this), getProperty());
    }
}

public class Database implements RemoteDatabase, Serializable {
    private final RemoteDatabase remote;
    private final String property;

    public Database(RemoteDatabase remote, String property) {
        this.remote = remote;
        this.property = property;
    }

    @Override
    public String getProperty() {
        return property;
    }

    @Override
    public void insertData(String data) throws RemoteException {
        remote.insertData(data);
    }
}
于 2012-12-04T15:54:30.180 に答える