Как сгруппировать вызовы 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 я думаю, что вы, как правило, должны пытаться написать свои методы, чтобы пакетная обработка даже не была проблемой, которую вы должны рассмотреть.