如果失败,我需要重试发送GWT RPC请求(除了HTTP 200之外的任何响应代码).原因很复杂,所以我不会详细说明.到目前为止,我在同一个地方处理所有请求响应,如下所示: // We override the RpcReque
// 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请求的高级参数,我更愿意使用已经流式传输并准备重新发送的请求内容.
有任何想法吗?
好吧,我自己找到了答案.所以它毕竟非常整洁.在负载较重的医院环境中工作,网络往往不可靠.这就是为什么我需要在放弃之前重新发送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); }
这对我来说很好用,你自己冒险使用它!