GWT RequestFactory и распространение изменений на стороне сервера на клиенте

Мне нужен совет о том, как лучше всего обрабатывать передачу изменений сущностей на стороне сервера клиенту с помощью RequestFactory GWT.

Предположим, у нас есть два EntityProxy, PersonProxy и PersonListProxy (у которого есть геттер для списка). Предположим, что клиент получил PersonList и Person с сервера.

В случае, если клиент редактирует один из этих прокси-серверов и запускает запрос, механизм RequestFactory (если я правильно понял принципы) будет запускать событие EntityProxyChange, если он обнаружит изменения, сделанные кодом сервера (чтобы клиент мог обновить свой дисплей). сущностей, например).

Теперь предположим, что сервер изменяет свои объекты вне запроса этого клиента (например, из-за того, что другой клиент вызывает сервер), чтобы этот клиент увидел другую версию, если он снова получит Person или PersonList.

Мой вопрос заключается в том, как лучше всего внутри структуры RequestFactory сообщить клиенту об изменениях (и повторно использовать как можно больше механизмов)? Мы можем предположить, что у меня есть способ отправлять простые сообщения с сервера клиенту (например, API канала Google App Engine или события, отправленные сервером).

Одна из идей может заключаться в том, что сервер отправляет по этому каналу сообщение о том, что Person или PersonList с определенным идентификатором изменились. Затем клиентский код, обрабатывающий получение этих сообщений, может использовать RequestFactory для повторной выборки (например, поиска) объекта. Затем это изменение должно быть распространено на другие части клиента с помощью события EntityProxyChange.

Это путь? (И в случае, если у клиента уже есть текущая версия объекта, например, из-за того, что сервер был тупым и уведомил клиента об изменениях, внесенных самим клиентом, будет ли инициированная повторная выборка просто транспортировать несколько бит метаданных, а не весь опять сущность?)

ДОБАВЛЕН:

Немного подумав об этом, я задаюсь вопросом, как можно сгенерировать EntityProxyId для канала событий, отправленного сервером. Когда объект на сервере изменяется, сервер имеет только идентификатор сервера. Затем он, конечно, может отправить его клиенту, но клиент знает только EntityProxyId. Конечно, я мог бы добавить getId() (в дополнение к getStableId()) для каждого EntityProxy, но похоже, что это добавит избыточные данные к каждому ответу сервера.


person Marc    schedule 29.03.2013    source источник
comment
Очень интересный вопрос! Просто примечание: разница всегда от клиента к серверу в RF (это то, для чего edit() на стороне клиента: отслеживать изменения, чтобы можно было сделать разницу)   -  person Thomas Broyer    schedule 29.03.2013
comment
Ах, так вы говорите, что find всегда создает новый EntityProxy и не принимает во внимание уже существующие EntityProxy с правильным идентификатором и версией, верно? И что я должен быть осторожен, чтобы возвращать небольшие объекты в моих запросах, поскольку здесь не делается различий со знаниями клиента, верно?   -  person Marc    schedule 29.03.2013
comment
Понятно... RequestFactory не может не знать, какие части объекта на стороне сервера изменились, поэтому это будет либо все, либо ничего.   -  person Marc    schedule 29.03.2013
comment
@Marc Привет, мне очень интересно узнать, как ты наконец это реализовал. У меня впереди та же задача, и я также использую RF и GAE на стороне сервера. Можете ли вы создать ответ с подробным описанием вашей реализации? Большое спасибо!   -  person manubot    schedule 17.01.2014


Ответы (1)


Ну, я понимаю, что мой пост не является точным ответом на ваш вопрос, но это просто мой опыт. По сути, как раз и стоит вопрос, как доставить данные с сервера на клиент. Я столкнулся с какой-то задачей пару лет назад и нашел для себя подход, облегчающий мою жизнь. Чтобы объяснить это, я хочу указать свои причины:

  • Вы должны иметь полную доставку данных, запрашивая их у клиента - это прямой, естественный способ запроса данных;
  • Вы не хотите создавать и поддерживать 2 разные модели полной доставки данных: одну путем запроса от клиента и вторую путем отправки с сервера;
  • Но вам нужно сообщить клиенту о некоторых изменениях на стороне сервера;

Итак, теперь я строю свою архитектуру, используя следующий подход:

  1. Создайте полный классический клиент-серверный API для доставки данных, чтобы вы могли загружать и обновлять свое приложение естественным образом, даже если ваши функции отправки заблокированы или не работают.
  2. Определите ключевую информацию, которая может быть изменена на стороне сервера и должна быть доставлена ​​клиенту через механизм push.
  3. Создайте небольшие конструкции push-сообщений, которые будут доставлять клиенту только уведомление об изменениях — никакие ценные данные не должны доставляться таким образом — только ключи, какие данные были изменены.
  4. Все, что нужно сделать на клиенте, когда он получит такое уведомление, — это просто получить/обновить данные с сервера естественным способом клиент-сервер, который уже поддерживается.
  5. Логика сервера не должна беспокоить клиентскую сторону огромным количеством уведомлений - иногда эффективнее не доставлять изменения, а просто обновить все.

Надеюсь это поможет.

person domax    schedule 08.06.2013
comment
Привет domax, как вы строите свое push-сообщение? Я изучаю это и могу найти Channel API для GAE, но я не могу найти библиотеку GWT, которая отображает его на клиенте (и я не умею писать JS) - person manubot; 15.01.2014
comment
Я использую github.com/Atmosphere/atmosphere См. также ответ здесь: stackoverflow.com/questions/9825849/ - person domax; 17.01.2014
comment
Он изменился с момента моего последнего визита туда. Теперь поддержка GWT доступна здесь: github.com/Atmosphere/atmosphere-extensions/ вики/ - person domax; 17.01.2014