Запрос почты из Java-приложения на HCP не выполняется

У меня проблема с httpPost из Java-приложения, которое работает на HCP-Trial-Account в Tomcat7-Container. Я использую HttpClient 4.5.3.

Код работает на моем локальном 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://stackru.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)  

Программа застревает на этом этапе.

Я понятия не имею, что делать, и буду очень признателен за некоторые советы и помощь:).

Привет Маверин

2 ответа

Как правило, вы должны использовать службу подключения для доступа к интернет-ресурсам из приложений, развернутых HCP. Я предполагаю, что попытка сделать это напрямую приводит к зависанию вашего приложения. Может также быть что-то еще, что я скучаю.

Вы можете найти информацию об этом в официальной документации: help.sap.com.

В двух словах:

  • Создайте пункт назначения (либо в вашей учетной записи HCP, либо непосредственно в приложении Java) по направлению к указанному сайту.
  • Поскольку вы используете HTTPS, вам, скорее всего, придется импортировать сертификат удаленного хоста в хранилище доверенных сертификатов ( ссылка на документацию).
  • Объявите конфигурацию подключения в web.xml.
  • Используйте JNDI (то есть InitialContext), чтобы получить конфигурацию подключения в вашем коде Java. Затем эту конфигурацию можно использовать для получения URL-адреса к удаленному ресурсу. Вы можете использовать этот URL, чтобы открыть прямое соединение или передать его HttpClient (у класса URL есть метод toURI).

У меня тоже была эта проблема, и в итоге я нашел решение, которое работает и с Tomcat8. Ключ заключается в том, чтобы установить соединение со сборщиком, а затем использовать useSystemProperties(). Таким образом, вы получаете свойства прокси, необходимые для HCP. Дополнительный материал с менеджером соединений не является строго необходимым, но он помогает с производительностью. 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;
}
Другие вопросы по тегам