XPages: Наблюдатель и Наблюдаемый - PullRequest
2 голосов
/ 24 февраля 2020

Я пытался использовать Java Observer и Observable в многопользовательском приложении XPages, но я сталкиваюсь с конфликтами идентичности. Я объясню.

Скажем, A и B имеют одинаковое представление на своих экранах, список документов с полями Readers. Мы хотим максимально синхронизировать эти экраны. Если A что-то меняет, B может получать обновления, в зависимости от его прав и ролей. Мы достигли этого с помощью WebSockets, но я хочу посмотреть, есть ли лучший способ, то есть без отправки клиенту сообщения, говорящего ему о повторном получении экрана.

Используя механизм Observer, B может наблюдать изменения и pu sh измененный экран для пользователя. Сложность в том, что если я вызываю notifyObservers как пользователя A и прохожу все наблюдаемые, A будет выполнять метод Observer.update(), а не B.

Я также подумал об использовании Timer- как решение, но я, вероятно, в конечном итоге столкнулся бы с такими же конфликтами.

Вопрос: есть ли какой-либо способ, которым я могу правильно переключать сеансы в XPages? Или я должен ждать публикации / подписки на сервере XPages?

1 Ответ

1 голос
/ 24 февраля 2020

Я вижу 3 возможных действия:

  • Использование SudoUtils из XPages-Scaffolding для запуска кода от имени
  • Использование DominoJNA для доступа к данным с другим идентификатором пользователя (не для слабонервных)
  • Просто уведомите клиента с помощью веб-сокета - предпочтительно через веб-работника. Затем он сделал бы выборку (художник, ранее известный как Ajax), чтобы увидеть, нужны ли изменения в пользовательском интерфейсе клиента. Хотя это имеет недостаток, заключающийся в возникновении сетевых перерывов (websocket + fetch), у него есть то преимущество, что вам не нужно связываться с имперсонализацией, которая всегда несет в себе риск того, что что-то пойдет не так.

Для Первые два я хотел бы упаковать их в комплект OSGi, чтобы он не зависел от особенностей Java, загруженных из NSF

Старый ответ

Ваш наблюдатель должен находиться в контекст приложения, так что вы можете обновить любой Observer. Затем наблюдатель будет использовать веб-сокет для клиента, чтобы сказать ему: обновить эту ОДНУ запись. Сложная часть, требует планирования: иметь индивидуальные адреса веб-сокетов, поэтому вы уведомляете только те, которые нуждаются в уведомлении

...