Как сгруппировать вызовы gwt-rpc?

С помощью DWR можно сгруппировать несколько вызовов служб в один HTTP-запрос:
функция пакетной обработки

Эта функция очень полезна для уменьшения задержки приложения ajax. Есть ли способ сделать что-то подобное с GWT / GWT-RPC?
Спасибо за вашу помощь

4 ответа

Рэй Райан из Google сделал презентацию о передовых методах разработки вашего GWT-приложения, где рассказал об использовании шаблона команд. Отправка асинхронных команд через RPC - это то, что вы, вероятно, хотите. Как только вы отправляете команды вместо RPC, их очень легко пакетировать.

Смотрите gwt-dispatch для библиотеки, которая реализует этот шаблон для вас. Я только начинаю его использовать, поэтому я не знаю, будет ли он пакетным автоматически, но все это с открытым исходным кодом с разрешительной лицензией, так что вы можете исправить это, если это не так.

Вы также можете использовать GWTEventService, если ваше приложение вписывается в домен Comet (на стороне сервера):

GWTEventService - это основанная на событиях коммуникационная среда клиент-сервер. Он использует GWT-RPC и технику Comet / server-push. Клиентская сторона предлагает высокоуровневый API с возможностью регистрировать слушателей на сервере, как на компонент GUI. События могут быть добавлены в контекст / домен на стороне сервера, а слушатели на стороне клиента получают информацию о входящих событиях. Серверная часть полностью независима от клиентской реализации и легко настраивается.

Потому что одно из преимуществ этой модели событий:

События объединяются, чтобы уменьшить количество обращений к серверу

GWT не предоставляет одношаговое решение для пакетирования нескольких произвольных RPC. Однако имейте в виду, что автоматическая сериализация GWT позволяет довольно легко писать как серийные, так и пакетные версии каждого из ваших методов RPC. Например, предположим, что вы определили этот RPC:

FooResponse callFoo(FooRequest request);

Легко написать "пакетную" версию того же самого RPC:

ArrayList<FooResponse> batchCallFoo(ArrayList<FooRequest> requests) {
  ArrayList<FooResponse> responses = new ArrayList<FooResponse>();
  for (FooRequest request : requests) {
    responses.add(callFoo(request));
  }
}

Это хороший вопрос, но я не думаю, что есть простое решение.

Я полагаю, что вам придется создать отдельный метод, объединяющий ваши методы для достижения пакетирования аналогично DWR.

Т.е. если у вас есть:

public int add(int x, int y);
public int sub(int i, int j);

Вы бы создали новый метод для их объединения:

public Map<String, Integer> addAndSub(Map methodsAndArguments) {
    // Call add and sub methods with it's arguments
}

Конечно, вам все равно придется обрабатывать весь ответ в том же методе обратного вызова.

Я понимаю, что это может быть не самое элегантное решение, но из-за того, как работает RPC GWT, я думаю, что это путь. С GWT я думаю, что вы, как правило, должны пытаться написать свои методы, чтобы пакетная обработка даже не была проблемой, которую вы должны рассмотреть.

Другие вопросы по тегам