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있는 동안은 그러므로 내가 정의 HTTPRequestInitializer 사용할 수 없습니다 HttpRequestFactory HttpRequestFactory requestFactory = httpTransport.createRequestFactory(GoogleCredential);

을 만들 통과해야합니다. GoogleCredential HTTPRequestInitializer를 사용하여 생성 된 HttpRequestFactory에 대한 readTimeout을 늘리려면 어떻게해야합니까?

답변

3

나는이 시도하지 않은,하지만 난 효과적으로 함께 요청 초기화를 체인 당신이 할 수 기대 : 기타에서

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

:

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

또는 람다 표현식으로

단어는 새로운 요청이 만들어지면 자격 증명이 헤더 등을 설정할 수있게하고 읽기 시간 제한도 설정합니다.

+0

위의'''HttpRequestInitializer requestInitializer = request -> {credential.initialize (request);}와 같은 아래의 lamda를 사용했습니다. request.setReadTimeout (0);}; HttpRequestFactory requestFactory = httpTransport.createRequestFactory (requestInitializer);''' – sag

+1

@sag : 물론 - 내 답변에 대안으로 추가 할 것입니다. –