В течение этого процесса я обнаружил, что классический Apache Httpclient 4.x (тот, который используется всеми проектами, над которыми я работаю), виртуальные потоки для носителей, когда пул соединений заполнен. Это происходит из-за вызова NIO, который блокирует VT до тех пор, пока соединение не станет доступным в базовом пуле подключения. /> Эта ситуация побудила меня мигрировать в Apache Httpclient 5, который я обнаружил, что совместима с VTS. , особенно при вызове метода execute () httpclient. Это хороший подход или, если он может привести к другим проблемам. p>
Код: Выделить всё
return WebClient.builder()
.baseUrl(baseUrl)
.filter(new CustomWebClientFilter(this.clientId).toExchangeFilterFunction())
.codecs(configurer -> {
configurer.defaultCodecs().jackson2JsonEncoder(new Jackson2JsonEncoder(objectMapper));
configurer.defaultCodecs().jackson2JsonDecoder(new Jackson2JsonDecoder(objectMapper));
})
.build();
< /code>
Затем, при использовании этого WebClient, я использую tofuture (), чтобы избежать реактивного программирования на протяжении всего моего приложения. Вот как я его реализовал: < /p>
public XsDiscountResponse getById(String socialId, String company) {
try {
CompletableFuture future = this.connector
.get()
.uri(uriBuilder -> uriBuilder
.path(GET_BY_ID_PATH)
.queryParam("company_id", company)
.build(socialId))
.accept(APPLICATION_JSON)
.retrieve()
.onStatus(
HttpStatusCode::isError,
response -> response.bodyToMono(String.class)
.flatMap(body -> Mono.error(
new ConnectorException(
"Error: " + response.statusCode() + ", Body: " + body))))
.bodyToMono(XsDiscountResponse.class)
.toFuture(); // Convert Mono to CompletableFuture
return future.get(); // Compatible with Loom for non-pinning waits
} catch (Exception ex) {
throw new ConnectorException("Error occurred during the request", ex);
}
}
< /code>
С помощью этого решения я все еще обращаю свои внешние зависимости в стиле блокировки, но я делегирую планирование потоков в VTS в моей JVM с использованием будущего. < /p>
Если я использую метод block () из Mono, я понимаю, что он вызовет закрепление. Что-то важное в том, как этот код блокировки/асинхронизации может вести себя в реальном приложении? Однако, поскольку VTs являются относительно «новыми», и я не использовал асинхронный webclient
Подробнее здесь: https://stackoverflow.com/questions/793 ... al-threads