Разгрузка классов, переданных через RMI - PullRequest
2 голосов
/ 29 августа 2010

У меня есть простое серверное приложение RMI 'compute' (аналогично this ), которое принимает объекты определенного типа интерфейса от клиентов через RMI, выполняет метод compute() полученного объекта и возвращает результатчерез RMI к удаленному клиенту.Задания являются одноразовыми, и между разными заданиями или между объектами разных заданий нет взаимодействия.

Я хотел бы иметь возможность изменять классы и отправлять экземпляры на вычислительный сервер для выполнения без постоянного перезапуска JVM сервера.Однако, когда класс, который был изменен, снова передается в качестве параметра для удаленного вызова, его поведение метода не изменяется (это также происходит с анонимными классами).Я читал о сериализации, и я понимаю, что это связано с тем, что ClassLoader не может изменять существующие классы.

Из моего чтения на SO и в других местах я понимаю, что каким-то образом ClassLoader, который загрузил потоковый класс, долженбыть GC'd и заменить, чтобы загрузить новую версию моего класса.У меня есть идея, как это сделать, но ситуация кажется сложной из-за базовой среды выполнения RMI, имеющей собственный RMIClassloader.

Мой вопрос: какой самый простой способ загрузить каждую новую версию полученного класса?через параметры RMI.В идеале я ищу способ, чтобы каждый удаленный вызов получал новый ClassLoader и избавлялся от него по возвращении.Можно ли обойтись без сложных знаний о настроенных загрузчиках классов и внутренностях RMI?

Любые указатели на материалы для чтения или примеры приветствуются!

Редактировать: вот удаленный интерфейс вычислительного сервера:

public interface ComputationEngine extends Remote {
    public Object execute(Task t) throws RemoteException;
}

и интерфейс 'compute job', Task:

public interface Task extends java.io.Serializable {
    public Object compute();
}

Ответы [ 2 ]

1 голос
/ 03 сентября 2010

Единственный способ сделать это - иметь новый ClassLoader, когда вы хотите изменить класс. Как насчет использования URLClassLoader и сделать код доступным с URL

Я использую его в одном из своих проектов для обновления API при изменении файла JAR. Посмотрите здесь: http://code.google.com/p/open-forum/source/browse/trunk/Wiki/org/one/stone/soup/wiki/jar/manager/JarManager.java Линия 184 +

Проверьте вашу электронную почту: -)

0 голосов
/ 29 августа 2010

Это на самом деле не отвечает на ваш вопрос, но может быть возможно превратить часть ваших классов в данные вместо фактического класса.Используйте Map вместо полей и т. Д. У вас будет намного меньше классов, и ваш код, вероятно, будет проще.

...