Простая точка входа для одного сервиса RMI?
У меня есть несколько служб, которые экспортируют интерфейс RMI.
Они предлагали это, создавая свой собственный реестр (с LocateRegistry.createRegistry
) и привязать его там. Однако это стало невозможным, когда службы были перемещены для запуска в качестве отдельных приложений на одной и той же виртуальной машине (Tomcat), потому что по какой-то причине там может присутствовать только один реестр.
Я работал над этим, используя центральный реестр для всех служб. Даже в этом случае меня не очень интересует роль реестра в нескольких объектах реестра, просто его возможности точки входа. Центральный реестр, однако, вносит большую сложность (например, он должен быть запущен первым, он должен иметь интерфейсы служб, которые он регистрирует).
Есть ли способ вернуть ситуацию, когда каждая служба независимо предлагает точку входа в свой интерфейс RMI, в то время как они работают на одной и той же виртуальной машине (которая является деталью хостинга, а не частью проекта)?
3 ответа
Если вы все еще заинтересованы в этой проблеме год спустя....
Можно запустить несколько реестров в рамках одной JVM. Просто позвони LocateRegistry.getRegistry
с четкими портами. У вас должны быть хорошо известные порты для каждой службы, но я думаю, что вы уже делаете это, если вы реализовали вариант 3 из этого ответа на другой вопрос.
Давным-давно существовала ошибка, которая не позволяла нескольким реестрам сосуществовать в одной и той же JVM, но это было исправлено в JDK 5. В Tomcat может быть что-то, что мешает запуску нескольких реестров RMI. Или, может быть, версия Tomcat, которую вы использовали, была поверх очень старого JDK.
Я забыл, что уже задавал подобный вопрос (по другой причине, сокращая код, до того, как я переместил службы вместе в 1 ВМ), где первый ответ предлагает способ обойти реестр:
Используйте UnicastRemoteObject, сериализуйте заглушку, полученную при экспорте объекта, и используйте общий файл, или сокет, или sneakernet, чтобы сделать заглушку доступной для клиентов.
Вы не можете иметь более одного Реестра на JVM, потому что Реестр имеет фиксированный идентификатор объекта RMI. Просто настройте все свои серверы, чтобы начать так:
static Registry registry;
// ...
try
{
registry = LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
}
catch (...) // whatever the exception is, probably ExportException
{
registry = LocateRegistry.locateRegistry(Registry.REGISTRY_PORT);
}
registry.rebind(...); // etc
Затем, какой бы из них ни был запущен первым, он запустит Реестр, а другие будут его использовать.