2010-06-07 88 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