#java #rmi #processbuilder
#java #рми #processbuilder
Вопрос:
я работаю над проектом для своей диссертации на JAVA, который требует автоматической генерации RMI из абстрактного синтаксического дерева. Я использую RMI как
`public int createProcess(CompilationUnit cu){
//Some Code Here
return processid;
} `
для генерации RMI из AST на каждом узле. И он автоматически сгенерирует файл интерфейса и все java-файлы из AST и поместит все методы в эти файлы. Я могу выполнять команды javac
, rmic <remote-class>
, rmiRegistry
с помощью process builder. Но
- как уничтожить и отменить привязку удаленных объектов после завершения процесса ? Должен ли я помещать этот код в конец каждого файла, где завершается управление?
public void exit() throws RemoteException { try{ // Unregister ourself Naming.unbind(mServerName); // Unexport; this will also remove us from the RMI runtime UnicastRemoteObject.unexportObject(this, true); } catch(Exception e){} }
- Должен ли я выполнять rmiRegistry после каждого создания удаленных методов / классов, или он автоматически добавит более поздние удаленные методы / классы в реестр, если он уже находится в состоянии выполнения (означает, что processbuilder уже выполняет команду «rmiRegistry»)? Например, если NodeA создаст Process1 (класс RMI) в NodeB, а затем выполнит его с помощью команд через Processbuilder, rmiRegistery будет в запущенном состоянии. Теперь, если NodeA хочет создать другой Процесс2 на NodeB, должен ли я остановить этот экземпляр rmiRegistery и перезапустить его, или нет необходимости делать это, Registery автоматически обнаружит и добавит новые привязки?
- Будут ли все RMI запускаться на одном и том же порту?? означает, что если я создам process1 и свяжу его с localhost / process1 и process2 с localhost / process2, можем ли мы получить к ним доступ через тот же порт?
я работаю с RMI впервые, поэтому у меня нет никакого предыдущего опыта или знаний.
Прошу прощения, мой вопрос показался неясным, поэтому я попытался добавить больше объяснений путем редактирования? Следуя этой ссылке на учебник
Комментарии:
1. Вам не нужно вызывать rmic. RMI способен динамически генерировать свои заглушки.
2. @StuartMarks, сэр, я использую этот учебник mrbool.com /…
3. @StuartMarks Сэр, означает ли это, что я должен скомпилировать только файлы, а затем запустить rmiRegistry?
4. Больше нет необходимости (начиная с Java 5, выпущенной в 2004 году) использовать
rmic
его для создания заглушек. Теперь они генерируются динамически. На самом деле Java 8, выпущенная ранее в этом году, устарелаrmic
. Просто скомпилируйте удаленный интерфейс и его реализацию, экспортируйте его, и UnicastRemoteObject автоматически создаст заглушку. Учебное пособие по Oracle RMI более современное, чем то, которое вы используете.5. Реестр — это отдельная проблема от заглушек. Если вы разветвляете
rmiregistry
процесс, вам нужно сделать это только один раз. Но, как отметил EJP, возможно, было бы проще использовать LocateRegistry.createRegistry для создания службы реестра в той же JVM, избегая необходимости разветвлять подпроцесс.
Ответ №1:
1 как уничтожить и отменить привязку удаленных объектов после завершения процесса?
См. 2, но я не знаю, почему вы хотите это сделать. Просто оставьте их существующими и привязанными к Реестру.
2 Должен ли я помещать этот код в конец каждого файла, где управление завершается?
Да, если вы хотите, чтобы он выполнялся, в противном случае нет. Однако не создавайте пустые catch-блоки.
3 Должен ли я выполнять rmiRegistry после каждого создания удаленного объекта
Нет, вы должны запустить его один раз, в начале содержащего процесса. Самый простой способ — через LocateRegustry.createRegistry() .
Комментарии:
1. извиняюсь, я должен отредактировать свой вопрос, чтобы сделать его более понятным, я думаю. Кстати
LocateRegustry.createRegistry()
, это свяжет все объекты с одним и тем же портом. В моей диссертации я буду запускать несколько процессов с других узлов, поэтому, чтобы сделать его более управляемым и чистым, мне, возможно, придется удалить объекты, чтобы, если в будущем тот же процесс будет создан снова, мы могли привязать его к тому же реестру. Спасибо 🙂2. После вашего редактирования реестр не «автоматически обнаруживает новые привязки». Новые привязки создаются registry.bind() / rebind() . Я не понимаю вашего замечания выше о разных портах. Вам не нужно несколько реестров, работающих на разных портах для каждого хоста.
3. Я не умею объяснять, но позвольте мне попробовать, при каждом вызове для создания процесса на обоих узлах будет генерироваться серверный код и клиентский код. (Правильно?). в каждом клиентском коде я должен обращаться к одному и тому же порту или каждый реестр будет привязываться к новому порту? Также, как предположил Стюарт, теперь мне нужно скомпилировать только код RMI. А затем выполните
start rmiregistry
илиrmiregistry
в зависимости от ОС. Но теперь другая проблема заключается в том, что если я создаю другой серверный клиентский код на обоих узлах, когдаrmiregistry
уже выполняется состояние выполнения или один из кодов уже запущен, должен ли я выполнять отдельный TBC…4. Продолжение. экземпляр
rmiregistry
или убить первый, а затем повторно выполнитьrmiregistry
или сохранитьrmiregistry
в живых, он обнаружит выполнение нового кода и обработает его?? ИЛИ, согласно вашему предложению, я могу добавитьLocateRegustry.createRegistry()
к одному для каждого сгенерированного кода, и когда будет выполнен новый код, он также будет обрабатывать все предыдущие привязки??5. Как я уже говорил вам, что вам не нужно несколько реестров, работающих на разных портах на хост, эти вопросы о нескольких реестрах и разных портах просто не имеют смысла. @stuartmarks прав в отношении заглушек.