2010-08-02 3 views
1

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

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

ответ

1

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

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

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

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

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

0

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

0

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

0

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

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

Это я, я бы JMS с динамичной темой.

Смежные вопросы