Использование Tofuture в Spring WebClient при использовании виртуальных потоковJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Использование Tofuture в Spring WebClient при использовании виртуальных потоков

Сообщение Anonymous »

Я пытался внедрить систему оркестровки с использованием виртуальных средств. . "
В течение этого процесса я обнаружил, что классический 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
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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