2010-06-07 70 views
0

我正在编写一个简单的Google Web Toolkit服务,它充当代理,它基本上存在以允许客户端向不同服务器发布POST。客户端实质上使用此服务来请求HTTP调用。该服务只有一个异步方法调用,称为ajax(),它应该只是转发服务器响应。我的代码实施呼叫看起来像这样:Google Web Toolkit来自服务实现的异步调用

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服务假定您在服务实现中同步行为。我该如何解决这个问题,并从我的服务方法实现中进行异步调用?

+0

只是为了验证 - 你希望ajax方法阻塞,直到你的异步sendRequest完成,然后返回结果 - 是的?你有两个异步调用,一个是通过rpc从gwt客户端到gwt服务器,另一个是从gwt服务器到外部服务器的异步调用,对吧? – 2010-06-07 02:36:38

+0

是的,这基本上是正确的 – 2010-06-07 20:33:21

回答

3

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

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

但我应该补充说,你不想在应用程序级别构建代理。您可以使用http代理,如apache's mod_proxy

+0

啊,你在这个特定情况下是正确的。尽管如此,我仍然想知道如何处理从服务实现中进行第二次异步调用。 (不能使用mod_proxy因为这是在App Engine上)。 – 2010-06-07 20:33:49

+0

如果您在GAE上,您将不得不使用'java.net.URL'来提出请求,'httpclient'不受支持。 – 2010-06-07 20:52:24

+0

通常,处理第二个异步调用很困难,因为您必须立即向客户端发送一些响应。你可以产生一个线程并放入一些同步代码,但这在GAE中不会起作用。唯一的方法是在第一个响应中发送句柄,然后在一段时间后发出第二个http请求以获取实际数据。如果你确实真的需要它,请发出多个http请求。 – 2010-06-07 20:56:59