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

Posted

技术标签:

【中文标题】来自服务实现的 Google Web Toolkit 异步调用【英文标题】:Google Web Toolkit Asynchronous Call from a Service Implementation 【发布时间】:2010-06-07 02:09:30 【问题描述】:

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

【问题讨论】:

只是为了验证 - 您希望 ajax 方法阻塞,直到您的异步 sendRequest 完成然后返回该结果 - 是吗?您有两个异步调用,一个从 gwt 客户端通过 rpc 到 gwt 服务器,另一个从 gwt 服务器到您的外部服务器的异步调用 - 对吧? 是的,基本正确 【参考方案1】:

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

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

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

【讨论】:

啊,在这种特殊情况下你是对的。不过,总的来说,我仍然想知道您将如何处理从服务实现进行第二次异步调用。 (不能使用 mod_proxy,因为它在 App Engine 上)。 如果您使用 GAE,则必须使用 java.net.URL 提出请求,不支持 httpclient 一般来说,处理第二个异步调用是很困难的,因为你必须马上向客户端发送一些响应。您可以生成一个线程并放入一些同步代码,但这在 GAE 中又不起作用。唯一的另一种方法是在第一个响应中发送一个句柄,然后在一段时间后发出第二个 http 请求以获取实际数据。如果您真的、真的、真的需要它,请发出多个 http 请求。

以上是关于来自服务实现的 Google Web Toolkit 异步调用的主要内容,如果未能解决你的问题,请参考以下文章

Anemometer+Percona Toolki实现MySQL慢查询日志可视化功能

Android Geocoder 和 Google Geocoding Web 服务之间的不同结果

是否有来自 HTML 5 的 Web 套接字的 WCF 服务器实现?

尽管 Google 帐户是所有者,但来自 Google 身份验证 Web api 的“错误 403:access_denied”

如何检查请求是不是来自 google、facebook、twitter 和 bing 爬虫? [复制]

如何根据来自 Web 服务的数据启用单选按钮?