来自服务实现的Google Web Toolkit异步调用

时间:2010-06-07 02:09:30

标签: java gwt gwt-rpc

我正在编写一个简单的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 个答案:

答案 0 :(得分:3)

您正在混淆客户端和服务器端代码。在ProxyServiceImpl中,您无法使用RequestBuilder。 RequestBuilder是一个客户端类,只能在浏览器中执行。

服务器到服务器的http调用始终是同步的。您应该使用像HttpClient之类的库,而不是使用RequestBuilder,获取结果,然后将其发送回客户端。这将解决您面临的问题。

但是我应该补充一点,你不想在应用程序级别构建代理。您也可以使用apache's mod_proxy之类的http代理。