4

現在、Vaadin Java フレームワークを試していますが、クライアント エンジンがサーバーへのリクエストの送信を再試行しないことに気付きました。モバイル インターネット ネットワークが弱い場合や不安定な場合は、あきらめるのではなく、リクエストの送信を再試行し続けることをお勧めします。

Vaadinでこれを達成する方法を知っている人はいますか?

4

2 に答える 2

0

私はこれがうまくいくことがわかりました:

 package com.vaadin.client;

 import com.google.gwt.http.client.RequestCallback;
 import com.google.gwt.http.client.RequestException;
 import com.google.gwt.user.client.Timer;

 public class RobustApplicationConnection extends ApplicationConnection {

public RobustApplicationConnection() {
    this.setCommunicationErrorDelegate(new ErrorHandler()); 
}

private String lastURI;
private String lastPayload;
private RequestCallback lastRequestCallback;

private enum RequestType {
    AjaxRequest,
    UidlRequest
}

private RequestType lastRequestType;

protected  void doAjaxRequest(java.lang.String uri, java.lang.String payload, RequestCallback requestCallback) throws RequestException {
    super.doAjaxRequest(uri, payload, requestCallback);
    lastRequestType = RequestType.AjaxRequest;
    lastURI = uri;
    lastPayload = payload;
    lastRequestCallback = requestCallback;
}

protected  void doUidlRequest(java.lang.String uri, java.lang.String payload) {
    super.doUidlRequest(uri, payload);
    lastRequestType = RequestType.UidlRequest;
    lastURI = uri;
    lastPayload = payload;
}

private class ErrorHandler implements ApplicationConnection.CommunicationErrorHandler {

    @Override
    public boolean onError(String details, int statusCode) {
        System.out.println("retrying in quarter second ...");
        Timer t = new Timer() { 
              public void run() { 
                  if (lastRequestType.equals(RequestType.AjaxRequest)){
                        try {
                            System.out.println("retrying doAjaxRequest...");
                            doAjaxRequest(lastURI,lastPayload,lastRequestCallback);
                        } catch (RequestException e) {
                            throw new RuntimeException("RequestException");
                        }
                    } else if (lastRequestType.equals(RequestType.AjaxRequest)){
                        System.out.println("retrying doUidlRequest...");
                        doUidlRequest(lastURI,lastPayload);
                    }
              } 
            }; 

            // delay running for quarter seconds 
            t.schedule(250); 


        return true;
    }

}

 }
于 2014-06-25T15:22:48.270 に答える