У меня есть простое серверное приложение 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();
}