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?
我已經使用了與上面相同的lamda'''HttpRequestInitializer requestInitializer = request - > {credential.initialize(request); request.setReadTimeout(0);}; HttpRequestFactory requestFactory = httpTransport.createRequestFactory(requestInitializer);''' – sag
@sag:當然 - 將在我的答案中添加替代。 –