문서의 선택한 두 판 사이의 차이를 보여줍니다.
양쪽 이전 판 이전 판 다음 판 | 이전 판 | ||
java:apache_http_client [2015/04/14 10:52] kwon37xi |
java:apache_http_client [2021/07/27 10:26] (현재) kwon37xi |
||
---|---|---|---|
줄 2: | 줄 2: | ||
* [[http:// | * [[http:// | ||
* [[https:// | * [[https:// | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
===== Connection 갯수 ===== | ===== Connection 갯수 ===== | ||
줄 12: | 줄 14: | ||
.... | .... | ||
</ | </ | ||
+ | |||
===== Connection/ | ===== Connection/ | ||
- | * [[http:// | + | * [[http:// |
+ | int timeout = 5; | ||
+ | RequestConfig config = RequestConfig.custom() | ||
+ | .setConnectTimeout(timeout * 1000) | ||
+ | .setConnectionRequestTimeout(timeout * 1000) | ||
+ | .setSocketTimeout(timeout * 1000).build(); | ||
+ | CloseableHttpClient client = | ||
+ | HttpClientBuilder.create().setDefaultRequestConfig(config).build(); | ||
+ | </ | ||
+ | * connectionTimeout : 서버에 소켓 연결을 맺을 때의 타임아웃 | ||
+ | * connectionRequestTimeout : ConnectionManager(커넥션풀)로부터 꺼내올 때의 타임아웃 | ||
+ | * socketTimeout : 요청/ | ||
+ | |||
+ | ===== Evict Idle Connections ===== | ||
+ | * KeepAlive 설정이 있을 경우, 서버에서 KeepAlive 시간 동안 사용되지 않은 커넥션(idle connection)을 죽이는 일이 생고 이를 '' | ||
+ | * 클라이언트 측에서도 Idle Connection을 주기적으로 지워주면 된다. | ||
<code java> | <code java> | ||
- | DefaultHttpClient | + | HttpClient |
- | HttpParams params = httpClient.getParams(); | + | .evictIdleConnections(2000L, TimeUnit.MILLISECONDS) |
- | HttpConnectionParams.setConnectionTimeout(httpParams, connectionTimeoutMillis); | + | .... |
- | HttpConnectionParams.setSoTimeout(httpParams, socketTimeoutMillis); | + | .build(); |
</ | </ | ||
+ | * [[http:// | ||
+ | >> Please note this method has no effect if the instance of HttpClient is configuted to use a shared connection manager. | ||
+ | >> Please note this method may not be used when the instance of HttpClient is created inside an EJB container. | ||
===== Request Character Encoding ===== | ===== Request Character Encoding ===== | ||
==== 일반 ==== | ==== 일반 ==== | ||
줄 42: | 줄 64: | ||
* [[http:// | * [[http:// | ||
- | ===== JVM 버그 대응 | + | ===== Stale Check ===== |
- | * 아래와 같은 오류가 발생할 | + | * Keep Alive 상태시 서버와 클라이언트 모두 접속중인 커넥션을 상대방에게 알리지 않고 접속을 끊을 |
+ | * Stale Check에 대해 각 버전별 버그 여부 등을 확인하고 올바로 설정해야 한다. | ||
+ | * http:// | ||
+ | > HTTP specification permits both the client and the server to terminate a persistent (keep-alive) connection at any time without notice to the counterpart, | ||
+ | > | ||
+ | > See the http.connection.stalecheck parameter documentation for more information. | ||
- | + | ===== 참조 ===== | |
- | Caused by: java.util.NoSuchElementException: | + | |
- | at java.util.ArrayList$Itr.next(ArrayList.java: | + | * [[https:// |
- | at org.apache.http.impl.cookie.BestMatchSpec.formatCookies(BestMatchSpec.java: | + | * [[https://github.com/dakrone/clj-http|dakrone/clj-http: An idiomatic clojure |
- | at org.apache.http.client.protocol.RequestAddCookies.process(RequestAddCookies.java: | + | * [[https://d2.naver.com/helloworld/0881672|nGrinder에 적용한 HttpCore 5와 HttpClient 5 살펴보기]] |
- | at org.apache.http.protocol.ImmutableHttpProcessor.process(ImmutableHttpProcessor.java: | + | |
- | at org.apache.http.protocol.HttpRequestExecutor.preProcess(HttpRequestExecutor.java: | + | |
- | at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java: | + | |
- | at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java: | + | |
- | at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java: | + | |
- | </ | + | |
- | * 이는 JVM의 Loop 최적화 관련 버그로 보이며 Java 8과 Java 7u60 이상 버전에서는 발생하지 않는다. 그 이하 버전에서는 JVM 시작시 다음과 옵션을 줘야 한다.< | + | |
- | -XX: | + | |
- | </ | + | |
- | * [[https://issues.apache.org/jira/browse/ | + | |
- | * [[http://bugs.java.com/ | + | |
- | * [[https://github.com/rholder/jvm-loop-unswitching-bug|JVM Loop unswitching bug 재현]] | + |