5

失敗した場合 (HTTP 200 以外の応答コード)、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);
                }
            });
        }
    });

したがって、httpResponseOkHandlerメソッドを使用して、HTTP の失敗をキャッチできます。しかし、リクエストを「再スロー」する方法、つまり再試行する方法はありますか? RPC 要求の高レベルのパラメーターを保存したくありません。既にストリーミングされ、再送信の準備ができている要求コンテンツを使用したいと考えています。

何か案は?

4

1 に答える 1

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);         
    }

これは私にとってはうまく機能しています、あなた自身のリスクでそれを使用してください!

于 2012-06-17T22:16:12.807 に答える