2012-06-15 1 views
5

GWT RPC要求が失敗した場合(HTTP 200以外の応答コード)には、再試行する必要があります。理由は複雑なので、私はそれについて詳述しません。私はこれまで持っていることは、私はこのように同じ場所にあるすべての要求応答を扱うです:だからGWT RPC要求が失敗した場合(または永続RPC要求を作成する方法)にGWT RPC要求を再送するにはどうすればよいですか?

// We override the RpcRequestBuilder.doSetCallback method and force your service to use it 
    // With this we can read the response headers if we need to. 
    ((ServiceDefTarget)serviceRPC).setRpcRequestBuilder(new RpcRequestBuilder() { 

     @Override 
     protected void doSetCallback(RequestBuilder rb, final RequestCallback callback) { 
      super.doSetCallback(rb, new RequestCallback() { 

       @Override 
       public void onResponseReceived(Request request, 
         Response response) { 
        httpResponseOkHandler(callback, request, response); 
       } 

       @Override 
       public void onError(Request request, Throwable exception) { 
        httpResponseErrorHandler(callback, request, exception); 
       } 
      }); 
     } 
    }); 

、私はHTTPの失敗をキャッチすることができますhttpResponseOkHandler方法を使用して。しかし、リクエストを「再開する」、つまりもう一度やり直す方法はありますか?私はRPCリクエストの高水準パラメータを保存したくないので、すでにストリーミングされていて再送の準備ができているリクエストコンテンツを使用することをお勧めします。

アイデア?

答えて

4

まあ、自分自身で答えを見つけました。結局のところ、それはかなりきれいです。高負荷の病院環境では、ネットワークは信頼性が低い傾向があります。だからこそ、私はいくつかの時間をあきらめる前にrpcリクエストを再送する必要があったのです。

1-すべてのリクエストの応答をキャッチするがリクエストビルダは保持する特別リクエストビルダを設定します。

((ServiceDefTarget)serviceRPC).setRpcRequestBuilder(new RpcRequestBuilder() { 

     @Override 
     protected void doSetCallback(RequestBuilder rb, final RequestCallback callback) { 
      final RequestBuilder requestBuilder = rb; 
      super.doSetCallback(rb, new RequestCallback() { 

       @Override 
       public void onResponseReceived(Request request, 
         Response response) { 
        httpResponseOkHandler(requestBuilder, callback, request, response); 
       } 

       @Override 
       public void onError(Request request, Throwable exception) { 
        httpResponseErrorHandler(requestBuilder, callback, request, exception); 
       } 
      }); 
     } 
    }); 

2リクエストビルダを使用して、必要な回数だけリクエストを送信します。 1つの大きな点はリクエストビルダがすでに設定されていて、POJOのシリアル化されていないデータを格納する必要がないようにデータがシリアライズされていることです。

// We had some server HTTP error response (we only expect code 200 from server when using RPC) 
    if (response.getStatusCode() != Response.SC_OK) { 
     Integer requestTry = requestValidation.get(requestBuilder.getRequestData()); 
     if (requestTry == null) { 
      requestValidation.put(requestBuilder.getRequestData(), 1); 
      sendRequest(requestBuilder, callback, request); 
     } 
     else if (requestTry < MAX_RESEND_RETRY) { 
      requestTry += 1; 
      requestValidation.put(requestBuilder.getRequestData(), requestTry); 
      sendRequest(requestBuilder, callback, request); 
     } else { 
      InvocationException iex = new InvocationException("Unable to initiate the asynchronous service invocation -- check the network connection", null); 
      callback.onError(request, iex); 
     } 
    } else { 
     callback.onResponseReceived(request, response);   
    } 

これは私のためにうまくいきます。あなた自身のrisKで使用してください!

+0

requestValidationとは何ですか?地図ですか? –

+0

はい単純MAPです。たぶん、最もエレガントなソリューションではないかもしれません。私がそれを見てうれしいです。 –

関連する問題