java - 如何增加 Google HTTP 客户端中的 ReadTimeout

标签 java google-app-engine google-authentication google-http-client

我的应用程序在 GAE 中运行。此应用程序对我的 CloudML 进行 REST 调用。

代码如下

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自定义超时,但我们需要在创建 HttpRequestFactory 时传递 GoogleCredential HttpRequestFactory requestFactory = httpTransport.createRequestFactory(GoogleCredential);

因此我无法使用自定义 HTTPRequestInitializer。如何增加使用 GoogleCredential HTTPRequestInitializer 创建的 HttpRequestFactory 的 readTimeout?

最佳答案

我还没有试过这个,但我希望你能够有效地将请求初始值设定项链接在一起:

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(...);
    });

换句话说,当创建一个新请求时,凭据能够设置 header 等,然后您也可以设置读取超时。

关于java - 如何增加 Google HTTP 客户端中的 ReadTimeout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43756456/

相关文章:

java - .eml 预览,其中包含 html 正文中的图像

google-app-engine - appengine aetest 的不一致行为

google-app-engine - 如何在需要时保存和检索 View

javascript - 在不打开新窗口/标签的情况下使用谷歌身份验证登录

java - Spring MVC 404错误http请求

java - Eclipse:查找重写方法的父类(super class)或接口(interface)

google-app-engine - 解码 datastore.ByteString go

java - 无法授权使用 Google api 客户端访问环聊聊天 api

python - 如何从 python 函数登录 Google Cloud Storage?

java - 在抽象方法中返回一个值