0

私はプロキシとして機能する単純なGoogleWebToolkitサービスを作成しています。これは基本的に、クライアントが別のサーバーにPOSTを実行できるようにするために存在します。クライアントは基本的にこのサービスを使用してHTTP呼び出しを要求します。このサービスには、ajax()と呼ばれる非同期メソッド呼び出しが1つだけあり、サーバーの応答を転送するだけです。呼び出しを実装するための私のコードは次のようになります。

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サービスは、サービス実装で同期的に動作することを前提としているため、できません。これを回避し、サービスメソッドの実装から非同期呼び出しを行うにはどうすればよいですか?

4

1 に答える 1

3

クライアント側とサーバー側のコードを混同しています。ではProxyServiceImpl、RequestBuilderを使用できません。RequestBuilderは、ブラウザでのみ実行されるクライアント側のクラスです。

サーバー間のhttp呼び出しは常に同期です。RequestBuilderを使用する代わりに、HttpClientなどのライブラリを使用して結果を取得し、それをクライアントに返送する必要があります。それはあなたが直面している問題を解決するでしょう。

ただし、アプリケーションレベルでプロキシを構築する必要はありません。apacheのmod_proxyなどのhttpプロキシを使用することもできます。

于 2010-06-07T03:17:53.247 に答える