2012-06-15 26 views
5

Tôi yêu cầu thử lại để gửi yêu cầu RPC GWT nếu nó không thành công (bất kỳ mã phản hồi nào khác thì HTTP 200). Lý do rất phức tạp nên tôi sẽ không giải thích về điều đó. Những gì tôi có cho đến nay là tôi đối xử với tất cả các phản ứng yêu cầu trong cùng một vị trí như thế này:Cách gửi lại yêu cầu RPC GWT nếu nó không thành công (hoặc cách tạo yêu cầu RPC liên tục)?

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

Vì vậy, sử dụng phương pháp httpResponseOkHandler, tôi có thể bắt lỗi HTTP. Nhưng, có cách nào để "quay lại" Yêu cầu, tức là thử lại không? Tôi không muốn lưu trữ các thông số cấp cao của yêu cầu RPC, tôi muốn sử dụng nội dung yêu cầu đã được truyền trực tuyến và sẵn sàng gửi lại.

Bất kỳ ý tưởng nào?

Trả lời

4

Vâng, tự tìm thấy câu trả lời. Vì vậy, nó khá gọn gàng sau khi tất cả. Làm việc trong môi trường bệnh viện được tải nặng nề, mạng có xu hướng không đáng tin cậy. Vì vậy, đó là lý do tại sao tôi cần phải gửi lại yêu cầu rpc một vài lần trước khi bỏ cuộc. Đây là giải pháp:

1- Đặt cho bạn trình tạo yêu cầu đặc biệt để nhận tất cả các câu trả lời yêu cầu nhưng giữ trình tạo yêu cầu.

((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- Bây giờ, hãy sử dụng trình tạo yêu cầu để gửi yêu cầu bao nhiêu lần tùy thích. Một điều tuyệt vời là trình xây dựng yêu cầu đã được thiết lập và dữ liệu đã được tuần tự hóa mà tránh phải lưu trữ dữ liệu không được nhận dạng 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);   
    } 

Điều này làm việc tốt cho tôi, sử dụng nó theo cách riêng của bạn!

+0

Yêu cầu xác thực là gì? Đây có phải là bản đồ không? –

+0

Có một MAP đơn giản. Có lẽ không phải là giải pháp thanh lịch nhất, nếu bạn có cái gì đó để đề xuất tôi sẽ rất vui khi nhìn vào nó. –

Các vấn đề liên quan