Java RMI и / или JNDI: привязка для объектов, которые не являются синглетонами - PullRequest
0 голосов
/ 24 марта 2011

ОК, я понимаю, как использовать RMI для привязки одноэлементного серверного объекта с известным именем, чтобы другие JVM могли его найти.

Допустим, у меня есть несколько процессов, каждый из которых выполняет JVMи каждый создает объект, поддерживающий интерфейс FooRemote, который я хочу показать через RMI.Каждый процесс имеет непредсказуемый жизненный цикл, который соответствует чему-то, будь то из пользовательского ввода или доступности ресурса.

Как я могу связать их без коллизий имен?Поможет ли использование JNDI?

По сути, я хотел бы иметь пул схожих объектов, каждый на отдельной виртуальной машине Java (причина для этого важна, но выходит за рамки этого вопроса).Мне нужен клиент, чтобы иметь возможность перечислять, какие объекты доступны, и выбирать один для дальнейшего взаимодействия.

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

1 Ответ

2 голосов
/ 24 марта 2011

Это не очень эффективно, но вы можете иметь одноэлементный менеджер (фабрику) в каждой JVM, который создает и перечисляет все объекты в пуле, которые принадлежат этой JVM.

Вы, очевидно, должны спросить ихвсе, чтобы получить полную картину.Это может или не может быть тем, что вы хотите, в зависимости от вашего фактического варианта использования.Несмотря на свою точность, сетевой трафик и задержки сильно влияют на производительность, поэтому не пытайтесь делать это, если запрашиваете пул намного больше, чем обновляете его.

Другое решение - превратить ваш клиент в сервер иразрешить серверам вызывать обратный вызов при изменении состояния объектов в пуле.Это решение, вероятно, более эффективно для сетевого трафика, но менее актуально: если один из серверов внезапно завершает работу, его объекты не будут удалены из пула, пока вы на самом деле не попытаетесь их использовать и произойдет сбой.Это поведение может быть улучшено с помощью вызова keepalive и тайм-аута для отслеживания доступности серверов, но, очевидно, ценой увеличения трафика и сложности вашего решения.

...