我已经在很多地方搜索了解决方案,但我找不到。
我的问题是如何定义一个离线方法,所以在我从 RMI 服务器获取对象后,我将能够调用此方法,它不会从服务器获取数据,而是从客户端中的对象获取数据。
更具体地说,可以说我有带有 2 个方法和一个私有变量的 Database 类。方法1:返回变量的值(属性方法..) - 应该是离线方法,因为我已经在客户端的对象中有变量。方法2:向数据库中插入新数据(sql命令..)。- 应该是在线方法,以便服务器可以连接到数据库。
非常感谢!
我已经在很多地方搜索了解决方案,但我找不到。
我的问题是如何定义一个离线方法,所以在我从 RMI 服务器获取对象后,我将能够调用此方法,它不会从服务器获取数据,而是从客户端中的对象获取数据。
更具体地说,可以说我有带有 2 个方法和一个私有变量的 Database 类。方法1:返回变量的值(属性方法..) - 应该是离线方法,因为我已经在客户端的对象中有变量。方法2:向数据库中插入新数据(sql命令..)。- 应该是在线方法,以便服务器可以连接到数据库。
非常感谢!
如果您需要此功能,我建议您改用 JMS 消息传递,因为这可以让您更有效地管理异步消息。它还支持可选持久化的队列和主题。
你不能那样做。您将需要调整您的设计。令人高兴的是,我认为您不需要对设计进行太多调整。
关键是能够决定每个对象是远程对象还是本地对象。对远程对象的调用将转到服务器,而对本地对象的调用将保持在本地。如果您有一个想要同时成为两者的对象,则需要将其一分为二,因此您有一个本地部分和一个远程部分。为了为客户端维护一个方便的界面,您可以将远程对象隐藏在本地对象后面。
这是您如何执行此操作的草图:
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);
}
}