问题描述
如果失败,我需要重试发送 GWT RPC 请求(除 HTTP 200 之外的任何响应代码).原因很复杂,我就不详述了.到目前为止,我在同一个地方处理所有请求响应,如下所示:
I require retrying to send a GWT RPC request if it fails (any response code other then HTTP 200). Reasons are complex so I won't elaborate on that. What I have so far is I treat all request responses in the same place like this:
// 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 请求的高级参数,我更愿意使用已经流式传输并准备重新发送的请求内容.
So, using httpResponseOkHandler method, I can catch HTTP failures. But, is there a way to "rethrow" the Request, i.e. try again? I don't want to store the high level parameters of the RPC request, I would prefer to use the request content that was already streamed and ready to resend.
有什么想法吗?
推荐答案
好吧,我自己找到了答案.所以它毕竟很整洁.在负载重的医院环境中工作,网络往往不可靠.所以这就是为什么我需要在放弃之前重新发送 rpc 请求几次.这是解决方案:
Well, found the answer myself. So it's pretty neat after all. Working in heavily loaded hospital environments, network tend to be unreliable. So that is why I needed to resend rpc requests a few times before giving up. Here is the solution :
1- 设置您的特殊请求构建器以捕获所有请求响应,但保留请求构建器.
1- Set you special request builder to catch all requests responses but keep the request builder.
((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 未序列化的数据.
2- Now use the request builder to send the request as many times as you want. One great thing is the request builder was already set and data was serialized which avoids having to store POJO unserialized data.
// 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);
}
这对我来说很好用,请自行承担风险!
This is working fine for me, use it at your own risK!
这篇关于如果失败,如何重新发送 GWT RPC 请求(或如何创建持久性 RPC 请求)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!