Связано с: Передача удаленных параметров в RMI
Привет,
Я ищу решение следующей проблемы: у меня есть объекты локали (скажем, типа MyObject), которые удаленно представлены RemoteObject со ссылкой на эти объекты.
public class RemoteMyObject extends UnicastRemoteObject implements MyRemoteInterface {
MyObject refToLocale;
protected RemoteMyObject(MyObject locale) throws RemoteException {
super();
refToLocale = locale;
}
@Override // MyRemoteInterface
public void doSomething() throws RemoteException {
System.out.println("did it!");
}
public MyObject getLocale() {
return refToLocale;
}
}
Это работает, как и ожидалось. Я не хочу сериализовать MyObject
, потому что в нем есть ссылки на другие несериализуемые классы, а файлы классов зашифрованы. Теперь у меня есть коллекции MyObject
, и я хочу управлять ими удаленно. Поэтому я реализовал RemoteCollection
.
public class MyRemoteCollection extends UnicastRemoteObject implements
RemoteCollection<MyRemoteInterface> {
Collection<MyObject> localeCollection;
public MyRemoteCollection(Collection<MyObject> locale) throws RemoteException {
super();
localeCollection = locale;
}
@Override
public Collection<RemoteMyObject> getItems() throws RemoteException {
ArrayList<RemoteMyObject> result = new ArrayList<RemoteMyObject>();
for (MyObject locale : localeCollection) {
result.add(new RemoteMyObject(locale));
}
return result;
}
@Override
public void delete(MyRemoteInterface obj) {
MyObject locale = ((RemoteMyObject)obj).getLocale();
localeCollection.remove(locale);
}
}
Теперь проблема в том, что клиент вызывает getItems()
через RMI и получает коллекцию удаленных/прокси-объектов. Эти объекты можно использовать как обычно (я могу вызвать doSomething()
), но как только я захочу удалить один из этих объектов, у меня возникнет проблема: delete()
-метод ожидает объект, который он может привести к RemoteMyObject
, чтобы получить ссылку на локаль, но доставленный аргумент - это просто заглушка, поэтому приведение не выполняется.
Поскольку объект изначально был создан на сервере, мой вопрос заключается в том, могу ли я вернуть объект локали или есть более элегантное решение проблемы?
Спасибо за чтение.
Для полноты интерфейсы и сервер и клиент:
public interface MyRemoteInterface extends Remote {
void doSomething() throws RemoteException;
}
public interface RemoteCollection<REM> extends Remote {
Collection< ? extends REM> getItems() throws RemoteException;
void delete(REM obj) throws RemoteException;
}
public class MainServer {
public static void main(String[] args) {
try {
Registry registry = java.rmi.registry.LocateRegistry.createRegistry(1099);
Collection<MyObject> coll = new ArrayList<>();
coll.add(new MyObject());
coll.add(new MyObject());
coll.add(new MyObject());
MyRemoteCollection remCol = new MyRemoteCollection(coll);
registry.rebind("mylist", remCol);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
public class MainClient {
public static void main(String[] args) {
try {
Registry registry = LocateRegistry.getRegistry("localhost", 1099);
RemoteCollection<MyRemoteInterface> remCol = (RemoteCollection<MyRemoteInterface>)registry.lookup("mylist");
for (MyRemoteInterface item : remCol.getItems()) {
item.doSomething();
remCol.delete(item);
}
} catch (RemoteException | NotBoundException e) {
e.printStackTrace();
}
}
}