Google Web Toolkit Асинхронный вызов от реализации сервиса - PullRequest
0 голосов
/ 07 июня 2010

Я пишу простой сервис Google Web Toolkit, который действует как прокси, который в основном будет существовать, чтобы позволить клиенту сделать POST на другой сервер. Клиент по существу использует этот сервис для запроса HTTP-вызова. Служба имеет только один асинхронный вызов метода, называемый ajax (), который должен просто переслать ответ сервера. Мой код для реализации вызова выглядит так:

class ProxyServiceImpl extends RemoteServiceServlet implements ProxyService {
    @Override
    public Response ajax(String data) {
        RequestBuilder rb = /*make a request builder*/
        RequestCallback rc = new RequestCallback() {
            @Override
            public void onResponseReceived(Response response) {
                /* Forward this response back to the client as the return value of 
                   the ajax method... somehow... */
            }
         };
         rb.sendRequest(data, requestCallback);
         return /* The response above... except I can't */;
    }
}

Вы можете видеть основную форму моей проблемы, конечно. Метод ajax () используется асинхронно, но GWT решает быть умным и скрывать это от глупого старого разработчика, чтобы они могли просто написать нормальный код Java без обратных вызовов. Сервисы GWT в основном просто творят чудеса, а не принимают параметр обратного вызова.

Тогда возникает проблема, потому что GWT скрывает от меня объект обратного вызова. Я пытаюсь сделать свой собственный асинхронный вызов из реализации сервиса, но не могу, потому что сервисы GWT предполагают, что вы ведете себя синхронно в реализациях сервиса. Как я могу обойти это и сделать асинхронный вызов из моей реализации метода обслуживания?

1 Ответ

3 голосов
/ 07 июня 2010

Вы смешиваете код клиента и сервера. В ProxyServiceImpl вы НЕ МОЖЕТЕ использовать RequestBuilder. RequestBuilder - это класс на стороне клиента, который будет выполняться только в браузере.

HTTP-вызов от сервера к серверу всегда является синхронным. Вместо использования RequestBuilder вы должны использовать библиотеку, такую ​​как HttpClient , получить результаты и затем отправить их обратно клиенту. Это решит проблему, с которой вы столкнулись.

Но я должен добавить, что вы НЕ хотите создавать прокси на уровне приложения. Вы также можете использовать http-прокси, такой как apache's mod_proxy .

...