1

我已经在很多地方搜索了解决方案,但我找不到。

我的问题是如何定义一个离线方法,所以在我从 RMI 服务器获取对象后,我将能够调用此方法,它不会从服务器获取数据,而是从客户端中的对象获取数据。

更具体地说,可以说我有带有 2 个方法和一个私有变量的 Database 类。方法1:返回变量的值(属性方法..) - 应该是离线方法,因为我已经在客户端的对象中有变量。方法2:向数据库中插入新数据(sql命令..)。- 应该是在线方法,以便服务器可以连接到数据库。

非常感谢!

4

2 回答 2

0

如果您需要此功能,我建议您改用 JMS 消息传递,因为这可以让您更有效地管理异步消息。它还支持可选持久化的队列和主题。

于 2012-12-04T12:09:46.040 回答
0

你不能那样做。您将需要调整您的设计。令人高兴的是,我认为您不需要对设计进行太多调整。

关键是能够决定每个对象是远程对象还是本地对象。对远程对象的调用将转到服务器,而对本地对象的调用将保持在本地。如果您有一个想要同时成为两者的对象,则需要将其一分为二,因此您有一个本地部分和一个远程部分。为了为客户端维护一个方便的界面,您可以将远程对象隐藏在本地对象后面。

这是您如何执行此操作的草图:

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 回答