如果GWT RPC请求失败(或如何创建持久RPC请求),如何重新发送?

时间:2012-06-15 18:32:40

标签: gwt

如果失败,我需要重试发送GWT RPC请求(除HTTP 200之外的任何响应代码)。原因很复杂,所以我不会详细说明。到目前为止,我在同一个地方处理所有请求响应:

    // 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请求的高级参数,我更愿意使用已经流式传输并准备重新发送的请求内容。

有什么想法吗?

1 个答案:

答案 0 :(得分: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-现在使用请求构建器根据需要多次发送请求。一个很棒的事情是请求构建器已经设置并且数据被序列化,这避免了必须存储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);         
    }

这对我来说很好,可以自己使用它!