現在、Vaadin Java フレームワークを試していますが、クライアント エンジンがサーバーへのリクエストの送信を再試行しないことに気付きました。モバイル インターネット ネットワークが弱い場合や不安定な場合は、あきらめるのではなく、リクエストの送信を再試行し続けることをお勧めします。
Vaadinでこれを達成する方法を知っている人はいますか?
現在、Vaadin Java フレームワークを試していますが、クライアント エンジンがサーバーへのリクエストの送信を再試行しないことに気付きました。モバイル インターネット ネットワークが弱い場合や不安定な場合は、あきらめるのではなく、リクエストの送信を再試行し続けることをお勧めします。
Vaadinでこれを達成する方法を知っている人はいますか?
私はこれがうまくいくことがわかりました:
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;
}
}
}