2017-06-30 22 views
0

我目前使用Gmail API代表用户发送电子邮件。该邮件被发送一个接一个和接受者的平均规模为500 我经常看到{ "code" : 500, "errors" : [ { "domain" : "global", "message" : "Backend Error", "reason" : "backendError" } ], "message" : "Backend Error" }如何实施Google Gmail API的指数退避?

以及

{ "code" : 429, "errors" : [ { "domain" : "usageLimits", "message" : "Rate Limit Exceeded", "reason" : "rateLimitExceeded" } ], "message" : "Rate Limit Exceeded" }

谷歌的一些事件已经提出实施指数退避策略来解决这个错误。我已经实施了下面的解决方案,但它似乎并没有工作,并没有帮助这些错误。这是我的实施;

public GoogleCredential createCredentialWithRefreshToken(String accessToken, String refreshToken) 
    { 
      GoogleCredential credential = new GoogleCredential.Builder().setTransport(new NetHttpTransport()) 
       .setJsonFactory(new JacksonFactory()) 
       .setClientSecrets(Constants.GOOGLE_CLIENT_ID, Constants.GOOGLE_CLIENT_SECRET) 
       .setRequestInitializer(setHttpTimeout()) 
       .build(); 
      credential.setAccessToken(accessToken).setRefreshToken(refreshToken); 

      return credential; 

    } 
public HttpRequestInitializer setHttpTimeout() { 
      return new HttpRequestInitializer() { 

      @Override 
      public void initialize(HttpRequest httpRequest) throws IOException { 
       httpRequest.setUnsuccessfulResponseHandler(new HttpBackOffUnsuccessfulResponseHandler(backOff())); 
       httpRequest.setConnectTimeout(3 * 60000); // 3 minutes connect timeout 
       httpRequest.setReadTimeout(3 * 60000); // 3 minutes read timeout 
      } 

      private final ExponentialBackOff.Builder BACK_OFF = new ExponentialBackOff.Builder().setInitialIntervalMillis(500); 

      private BackOff backOff() { 
       return BACK_OFF.build(); 
      } 

      }; 
    } 
public static Gmail getGmailServiceForGoogleAccount(GoogleAccount googleAcct){ 
     Gmail gmailService = null; 
     GoogleCredential credential = new Utils().createCredentialWithRefreshToken(googleAcct.getAccess_token(),googleAcct.getRefresh_token()); 
     gmailService = new Gmail.Builder(new NetHttpTransport(), 
           new JacksonFactory(), credential) 
           .setApplicationName("test") 
           .build(); 

     return gmailService; 
    } 

这个实现有什么问题?我是否正确实施了自定义的HttpRequestInitializer。 我可以在哪里设置日志语句以查明是否按照指数策略重试请求?

请建议

回答

0

检查Exponential Backoff的Java实现:

ExponentialBackOff backoff = new ExponentialBackOff.Builder() 
     .setInitialIntervalMillis(500) 
     .setMaxElapsedTimeMillis(900000) 
     .setMaxIntervalMillis(6000) 
     .setMultiplier(1.5) 
     .setRandomizationFactor(0.5) 
     .build(); 
    request.setUnsuccessfulResponseHandler(new HttpBackOffUnsuccessfulResponseHandler(backoff)); 

检查这个SO post更多的参考。

+0

我已经在我的代码中提到了上面的Exponential Backoff实现。你看到有关该实现的任何问题!我应该自定义更多的参数吗? – zee