Есть ли способ отправить событие через объект RMI? - PullRequest
1 голос
/ 02 августа 2010

У меня есть несколько клиентов, все ссылающиеся на один и тот же удаленный объект через RMI, и мне было интересно, можно ли отправить событие в объект-заглушку во всех клиентах, когда один из них запускает на нем удаленный метод.*

Например, если удаленный объект "obj" имеет метод "updateValue ()" и клиент A запускает его через объект-заглушку, может ли сервер с реальным "obj" отправить событие, сообщающее клиентам A, B, C и т.д ... чтобы объект был обновлен?

Ответы [ 4 ]

1 голос
/ 03 августа 2010

RMI - это технология клиент-сервер, и канал RMI может использоваться для связи с удаленными объектами на сервере, но сервер не может перезвонить клиенту.

Ничто не мешает вам, тем не менее, иметь два канала RMI, чтобы обе стороны действовали как сервер и клиента, если вы понимаете, о чем я.

Мы сделали это, чтобы отправить уведомление настольному приложению, подключенному к центральному серверу, и оно работало нормально.Настольное приложение экспортирует (на языке RMI) заглушку обратного вызова, подключается к центральному серверу и регистрирует заглушку обратного вызова на сервере.Затем сервер может отправлять уведомления всем подключенным настольным приложениям.Конечно, вам необходимо настроить сетевую инфраструктуру (брандмауэр и т. Д.), Чтобы были возможны двунаправленные соединения.Так что да, я бы сказал, что это возможно, но требует немного больше усилий, чем один однонаправленный канал.

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

Другие альтернативы включают опрос или JMS, как упомянуто в другом ответе.

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

Возможно, вы захотите взглянуть на канал событий / службу сообщений Java (JMS) - я думаю, что это в значительной степени то, о чем вы говорите.Это основная особенность J2EE, но решение JMS может использоваться в вашей системе без остальной части J2EE.

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

JMX имеет API-интерфейс событий, который работает удаленно - не используйте его из первых рук.

Если вы хотите стать очень модным, вы можете запустить серверы RMI на всех клиентских компьютерах и передать им заглушки«главный» сервер, содержащий рассматриваемый объект.Этот основной сервер может вызывать заглушки, используя стандартный шаблон слушателя / модели.

Если бы это был я, я бы JMS с динамической темой.

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

То, что вы описываете, это механизм " push ", который не является частью RMI.То, что вы можете легко сделать, это какой-то механизм " pull ", где объект A, B, C и т. Д. Опрашивает сервер на предмет любого нового события.Но это также не является фактической частью RMI.Вам потребуется реализовать дополнительный метод с именем getNewEvent (), который вызывает сервер каждые X секунд, чтобы узнать, произошло ли новое событие.

...