2

我有我的應用程序在GAE中運行。這個應用程序對我的CloudML進行REST調用。如何在Google HTTP客戶端中增加ReadTimeout

以下是一個

GoogleCredential credential = GoogleCredential.getApplicationDefault() 
     .createScoped(Collections.singleton(CLOUDML_SCOPE)); 
HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport(); 
HttpRequestFactory requestFactory = httpTransport.createRequestFactory(
     credential); 
GenericUrl url = new GenericUrl(cloudMLRestUrl); 

JacksonFactory jacksonFactory = new JacksonFactory(); 
JsonHttpContent jsonHttpContent = new JsonHttpContent(jacksonFactory, getPayLoad()); 

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 

jsonHttpContent.setWrapperKey("instances"); 
jsonHttpContent.writeTo(baos); 
LOG.info("Executing request... " + baos.toString()); 
HttpRequest request = requestFactory.buildPostRequest(url, jsonHttpContent); 

HttpResponse response = request.execute(); 

通常上述代碼產生ReadTimeout異常的代碼。

java.net.SocketTimeoutException: Read timed out at 
java.net.SocketInputStream.socketRead0(Native Method) ~[na:1.8.0_121] at 
java.net.SocketInputStream.socketRead(SocketInputStream.java:116) 
~[na:1.8.0_121] at 
java.net.SocketInputStream.read(SocketInputStream.java:171) ~[na:1.8.0_121] 
at 

我們似乎可以自定義添加超時HttpRequestInitializer,但我們需要通過GoogleCredential而創建HttpRequestFactory HttpRequestFactory requestFactory = httpTransport.createRequestFactory(GoogleCredential);

因此,我不能自定義HTTPRequestInitializer使用。我如何增加使用GoogleCredential HTTPRequestInitializer創建的HttpRequestFactory的readTimeout?

回答

3

我沒有試過,但是我希望你能夠有效地將請求鏈接初始化在一起:

final GoogleCredential credential = ...; 
HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport(); 
HttpRequestFactory requestFactory = httpTransport.createRequestFactory(
    new HttpRequestInitializer() { 
     @Override public void initialize(HttpRequest request) { 
      credential.initialize(request); 
      request.setReadTimeout(...); 
     } 
    }); 

或者作爲一個lambda表達式:

final GoogleCredential credential = ...; 
HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport(); 
HttpRequestFactory requestFactory = httpTransport.createRequestFactory(
    request -> { 
     credential.initialize(request); 
     request.setReadTimeout(...); 
    }); 

在其他字,當創建新的請求時,憑證可以設置標題等,然後設置讀取超時。

+0

我已經使用了與上面相同的lamda'''HttpRequestInitializer requestInitializer = request - > {credential.initialize(request); request.setReadTimeout(0);}; HttpRequestFactory requestFactory = httpTransport.createRequestFactory(requestInitializer);''' – sag

+1

@sag:當然 - 將在我的答案中添加替代。 –