2

Tomcat7-Container의 HCP-Trial-Account에서 실행중인 Java 애플리케이션의 httpPost에 문제가 있습니다. 4.5.3 HttpClient를 사용합니다.HCP에서 Java-Application의 게시 요청을 수행하지 않았습니다.

이 코드는 내 로컬 Tomcat7-Server에서 실행되며 작동합니다. 그러나 HCP에 배치하면 문제가 발생합니다.

public static Notebook getAllNotebooks(String code, String redirectUri) throws IOException, URISyntaxException{ 
     ClassLoader classLoader = Connection.class.getClassLoader(); 
     URL resource = classLoader.getResource("org/apache/http/impl/client/HttpClientBuilder.class"); 
     String returnUri = "https://login.live.com/oauth20_token.srf"; 
     HttpPost tokenRequest = new HttpPost(returnUri); 
     HttpClient client = new DefaultHttpClient();//HttpClientBuilder.create().build(); //Exception: http://stackoverflow.com/questions/22330848/httpclient-example-exception-in-thread-main-java-lang-nosuchfielderror-inst 

     tokenRequest.setHeader(HttpHeaders.CONTENT_TYPE, "application/x-www-form-urlencoded"); 
     tokenRequest.setEntity(new UrlEncodedFormEntity(Connection.getParametersForURLBody(code, redirectUri), Consts.UTF_8)); 
     tokenRequest.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:28.0) Gecko/20100101 Firefox/28.0"); 
     HttpResponse tokenResponse = client.execute(tokenRequest); //Here it gets stuck 

tokenRequest가 실행될 때 문제가 발생합니다. 응용 프로그램이 멈추고 tokenRequest가 영원히 실행됩니다.

SAP JVM Debug Target  
Daemon Thread [NioBlockingSelector.BlockPoller-1] (Running) 
Daemon Thread [NioBlockingSelector.BlockPoller-2] (Running) 
Daemon Thread [RMI TCP Connection(1)-127.0.0.1] (Running) 
Thread [Timer-0] (Running) 
Daemon Thread [RMI TCP Connection(2)-10.117.35.76] (Running)  
Thread [pool-1-thread-1] (Running) 
Thread [Timer-1] (Running) 
Daemon Thread [ContainerBackgroundProcessor[StandardEngine[Catalina]]] (Running)  
Daemon Thread [JCoTimeoutChecker] (Running) 
Daemon Thread [http-bio-8001-Acceptor-0] (Running) 
Daemon Thread [http-bio-8001-AsyncTimeout] (Running)  
Daemon Thread [http-nio-127.0.0.1-9001-ClientPoller-0] (Running)  
Daemon Thread [http-nio-127.0.0.1-9001-Acceptor-0] (Running)  
Daemon Thread [http-nio-8041-ClientPoller-0] (Running) 
Daemon Thread [http-nio-8041-Acceptor-0] (Running) 
Daemon Thread [ajp-bio-8009-Acceptor-0] (Running) 
Daemon Thread [ajp-bio-8009-AsyncTimeout] (Running) 
Daemon Thread [RMI TCP Connection(10)-127.0.0.1] (Running) 
Daemon Thread [RMI TCP Connection(11)-10.117.10.34] (Running) 
Thread [main] (Running) 
Daemon Thread [http-nio-8041-exec-1] (Running) 
Daemon Thread [http-nio-8041-exec-2] (Running) 
Daemon Thread [http-nio-8041-exec-3] (Running) 
Daemon Thread [http-nio-8041-exec-4] (Running) 
Daemon Thread [http-nio-8041-exec-5] (Running) 
Thread [pool-2-thread-1] (Running) 
Daemon Thread [http-nio-8041-exec-6] (Stepping) 
Daemon Thread [http-nio-8041-exec-7] (Running) 
Daemon Thread [http-nio-8041-exec-8] (Running) 
Daemon Thread [http-nio-8041-exec-9] (Running) 
Daemon Thread [http-nio-8041-exec-10] (Running) 
Daemon Thread [RMI TCP Connection(idle)] (Running) 
Daemon Thread [RMI TCP Connection(idle)] (Running) 

이 프로그램은이 시점에서 stucked됩니다 : 여기

내가 디버그 모드에서 볼 수 있습니다 영원히 실행중인 스레드입니다.

실마리가 없으며 몇 가지 힌트와 도움을 주셔서 감사합니다. :)

인사말 Maverin

+0

아마도 프록시를 구성해야합니다. 해당 답변에서 언급 된 설명서를 참조하십시오. – vap78

+0

그게 전부 괜찮아요,하지만 예제는 모두 UrlConnection과 함께, 나는 httpclient와 함께 그것을 실행하는 방법을 모르겠다. 정말 도움이 되었으면 좋겠다. :) – MaverinCode

+0

https://hc.apache.org/httpcomponents-client-ga/examples.html에서 apache http 클라이언트 및 프록시로 예제를 확인할 수 있습니다. – vap78

답변

0

일반적으로, 당신은 HCP-배포 된 응용 프로그램 내에서 인터넷 리소스에 액세스하기 위해 연결 서비스를 사용해야합니다. 나는 그것을 직접하려고 노력하는 것은 당신에게 애플 리케이션이 얼거나 추락하게 할 것이라고 생각한다. 내가 놓친 다른 것도있을 수 있습니다.

공식 문서에서이 작업에 대한 정보를 찾을 수 있습니다 : help.sap.com. (당신의 HCP 계정에 직접 자바 응용 프로그램에서 하나) 지정된 사이트쪽으로

  • 대상을 만듭니다 : 간단히 말해서

    , 당신은해야합니다.
  • HTTPS를 사용하기 때문에 원격 호스트의 인증서를 트러스트 스토어 (docu link)로 가져와야 할 가능성이 큽니다.
  • web.xml에서 연결 구성을 선언하십시오.
  • 자바 코드에서 연결 구성을 가져 오려면 JNDI (즉, InitialContext)를 사용하십시오. 그런 다음이 구성을 사용하여 원격 자원에 대한 URL을 얻을 수 있습니다. 이 URL을 사용하여 직접 연결을 열거 나 HttpClient에 전달할 수 있습니다 (URL 클래스에는 toUR 메소드가 있음).
+0

HCP Tomcat7 런타임에서 연결 서비스는 주로 구성을위한 안전한 저장소입니다 (예 : URL, 사용자/암호 등). http 클라이언트 생성, 신뢰 저장소 구성 등과 같은 모든 것들은 어플리케이션에 의해 수행됩니다. – vap78

+0

이 예제를 따랐습니다. https://help.hana.ondemand.com/help/frameset.htm?4da3b13c88ce4220bbd56a4361799668.html 하지만 ur 연결 대신 httpclient를 사용하는 방법을 모르겠습니다. – MaverinCode

+1

문제는, 내가 바람둥이 7에 대한 모든 예제를 시도했지만, 정말 URL 연결 대신 httpclient로 어떻게하는지 모르겠다. – MaverinCode

0

이 문제도 있었지만 결국에는 Tomcat8에서도 작동하는 해결책을 발견했습니다. 핵심은 빌더와 연결 한 다음 useSystemProperties()를 사용하는 것입니다. 이렇게하면 HCP에 필요한 프록시 속성을 얻을 수 있습니다. connectionmanager를 사용하는 추가 작업은 꼭 필요한 것은 아니지만 성능 향상에 도움이됩니다. param-syncro는 유산입니다.

org.apache.http.impl.conn.PoolingHttpClientConnectionManager cm 
public static HttpClient getHttpClient(){ 
    if(cm == null){ 
     synchronized(params){ 
      cm = new PoolingHttpClientConnectionManager(); 
      // Increase max total connection to 200 
      cm.setMaxTotal(200); 
      // Increase default max connection per route to 20 
      cm.setDefaultMaxPerRoute(200); 
     } 
    } 
    org.apache.http.impl.client.CloseableHttpClient httpClient = HttpClients.custom() 
      .setConnectionManager(cm) 
      .useSystemProperties() 
      .build(); 
    return httpClient; 
}