Apache httpclient 5.x получение ответов после превышения тайм -аутаJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Apache httpclient 5.x получение ответов после превышения тайм -аута

Сообщение Anonymous »

Я разработал приложение на стороне сервера, которое реализует механизм очереди, где входящие запросы намеренно задерживаются на 5 секунд перед отправкой ответа. < /p>
На стороне клиента я использую Последняя версия Apache httpclient 5.3.1 и настроила 4-секундную тайм-аут для запросов. Тем не менее, я наблюдаю, что некоторые ответы получены после 4-секундного тайм-аута, даже если сервер намеренно придерживается запросов в течение 5 секунд.
проблема : < /p>

Эта проблема возникает случайным образом - иногда запросы правильно время от времени, но в других случаях клиент все еще получает ответы после 5 Секунды.package com.vendor;
import java.net.URI;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;

import javax.net.ssl.SSLContext;

import org.apache.hc.client5.http.async.methods.SimpleHttpRequest;
import org.apache.hc.client5.http.async.methods.SimpleHttpResponse;
import org.apache.hc.client5.http.async.methods.SimpleRequestBuilder;
import org.apache.hc.client5.http.classic.methods.HttpPost;
import org.apache.hc.client5.http.config.RequestConfig;
import org.apache.hc.client5.http.impl.async.CloseableHttpAsyncClient;
import org.apache.hc.client5.http.impl.async.HttpAsyncClientBuilder;
import org.apache.hc.client5.http.impl.async.HttpAsyncClients;
import org.apache.hc.client5.http.impl.nio.PoolingAsyncClientConnectionManager;
import org.apache.hc.client5.http.impl.nio.PoolingAsyncClientConnectionManagerBuilder;
import org.apache.hc.client5.http.ssl.DefaultClientTlsStrategy;
import org.apache.hc.client5.http.ssl.NoopHostnameVerifier;
import org.apache.hc.core5.concurrent.FutureCallback;
import org.apache.hc.core5.http.ContentType;
import org.apache.hc.core5.net.URIBuilder;
import org.apache.hc.core5.reactor.IOReactorConfig;
import org.apache.hc.core5.ssl.SSLContexts;
import org.apache.hc.core5.ssl.TrustStrategy;
import org.apache.hc.core5.util.Timeout;

public class AsyncHttpClientBulkRequests {

public static void main(String[] args) throws InterruptedException {
// Number of requests
AtomicLong successCounter = new AtomicLong(0);
AtomicLong failCounter = new AtomicLong(0);
AtomicLong cancelCounter = new AtomicLong(0);
AtomicLong deadlineCounter = new AtomicLong(0);

int totalRequests = 10000;

try {
IOReactorConfig ioReactorConfig = IOReactorConfig.custom()
.setSoTimeout(Timeout.ofMilliseconds(4000))
.setIoThreadCount(Runtime.getRuntime().availableProcessors()).build();

CloseableHttpAsyncClient asyncclient = null;

HttpAsyncClientBuilder builder = HttpAsyncClients.custom();

setConnectionProperties(builder, createConnectionmanager());

asyncclient = builder.setIOReactorConfig(ioReactorConfig).build();

asyncclient.start();

ExecutorService executorService = Executors.newFixedThreadPool(10);

List futures = new ArrayList();

for (int i = 0; i < totalRequests; i++) {
int requestId = i; // For tracking

URIBuilder uribuilder = new URIBuilder("http://localhost:18888/dynamicResponseThreadWait");

URI uri = uribuilder.build();

HttpPost httpPost = new HttpPost(uri);
SimpleHttpRequest httpRequest = SimpleRequestBuilder.copy(httpPost).build();

RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(4000, TimeUnit.MILLISECONDS)
.setResponseTimeout(4000, TimeUnit.MILLISECONDS).build();
httpRequest.setConfig(requestConfig);

String requestBody ="{\r\n"
+ " \"threadWaitInMilliSeconds\": \"5000\",\r\n"
+ " \"ResponseKey\": \"1999999990\",\r\n"
+ " \"ResponseData\": {\r\n"
+ " \"1999999990\": "+requestId+"\r\n"
+ " }\r\n"
+ "}";

httpRequest.setBody(requestBody, ContentType.APPLICATION_JSON);

long startTime = System.currentTimeMillis(); // Record start time

/// Submit each request to the client and add a callback
futures.add(asyncclient.execute(httpRequest, new FutureCallback() {
@Override
public void completed(SimpleHttpResponse response) {

long endTime = System.currentTimeMillis();
long responseTimeMs = endTime - startTime;

successCounter.incrementAndGet();
System.err.println("Request:"+ requestId+ " completed with status: "+response.getCode() + ", TimeDiff:"+responseTimeMs);
}

@Override
public void failed(Exception ex) {
long endTime = System.currentTimeMillis();
long responseTimeMs = endTime - startTime;
failCounter.incrementAndGet();

//System.out.println("Request "+requestId+ " failed: " +ex.getMessage()+", responseTimeMs:"+responseTimeMs);
}

@Override
public void cancelled() {
cancelCounter.incrementAndGet();
System.out.printf("Request %d cancelled%n", requestId);
}

}));

}

// Wait for all requests to complete
for (Future future : futures) {
try {
future.get(); // Wait for completion
} catch (ExecutionException | InterruptedException e) {
//System.err.println("Error waiting for request to complete: " + e.getMessage());
}
}

executorService.shutdown();
executorService.awaitTermination(1, TimeUnit.MINUTES);

System.out.println("All requests completed! TotalCount : " + totalRequests);
System.out.println("SuccessCounter: "+ successCounter.get());
System.out.println("FailCounter: "+ failCounter.get());
System.out.println("CancelCounter: " + cancelCounter.get());
System.out.println("DeadlineCounter: " + deadlineCounter.get());

} catch (Exception e) {
e.printStackTrace();
}
}

protected static PoolingAsyncClientConnectionManager createConnectionmanager() throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException {

TrustStrategy acceptingTrustStrategy = new TrustStrategy() {
@Override
public boolean isTrusted(X509Certificate[] certificate, String authType) {
return true;
}
};

SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(null, acceptingTrustStrategy).build();
return PoolingAsyncClientConnectionManagerBuilder.create().setTlsStrategy(new DefaultClientTlsStrategy(sslContext, NoopHostnameVerifier.INSTANCE)).build();
}

protected static void setConnectionProperties(HttpAsyncClientBuilder builder, PoolingAsyncClientConnectionManager connectionManager) {

if (connectionManager != null) {
connectionManager.setDefaultMaxPerRoute(100);
connectionManager.setMaxTotal(1000);
builder.setConnectionManager(connectionManager);
}
}
}


ожидаемый результат : если запрос занимает больше 4 секунды, клиент должен время от времени и не получать никакого ответа.
фактический результат : Некоторые запросы по -прежнему получают ответ через 5 секунд, даже если время ожидания ответа установлена ​​на 4 секунды.
**OutPut:**

Request:109 completed with status: 200, TimeDiff:9145
Request:115 completed with status: 200, TimeDiff:9143
Request:105 completed with status: 200, TimeDiff:9146
Request:116 completed with status: 200, TimeDiff:9143


Подробнее здесь: https://stackoverflow.com/questions/794 ... ured-limit
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Apache httpclient 5.x получение ответов после превышения тайм -аута
    Anonymous » » в форуме JAVA
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous
  • Apache httpclient 5.x получение ответов после превышения тайм -аута
    Anonymous » » в форуме Apache
    0 Ответы
    51 Просмотры
    Последнее сообщение Anonymous
  • Apache httpclient 5.x получение ответов после превышения тайм -аута
    Anonymous » » в форуме JAVA
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous
  • Получение ошибки тайм-аута — увеличьте значение тайм-аута отправки при привязке.
    Anonymous » » в форуме C#
    0 Ответы
    62 Просмотры
    Последнее сообщение Anonymous
  • Получение ошибки тайм-аута — увеличьте значение тайм-аута отправки при привязке.
    Anonymous » » в форуме C#
    0 Ответы
    47 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»