Spring WebClient генерирует javax.net.ssl.SSLException: SSLEngine закрывается уже при интенсивном использовании - PullRequest
0 голосов
/ 04 ноября 2018

Это мой код:

WebClient.create().post()
                .uri(URI.create(url))
                .header("Authorization",
                        "Basic " + Base64Utils.encodeToString(("username:password").getBytes(UTF_8)))
                .body(Mono.just(requestBody), Object.class)
                .retrieve()
                .bodyToMono(responseType)

Я вызываю эту функцию из нескольких потоков одновременно. Когда я называю это только 20 ~ 30 раз за один проход, он работает отлично. Но когда я звоню 500-600 раз за 2 минуты (по тому же URL), это выдает

javax.net.ssl.SSLException: SSLEngine closed already
    at io.netty.handler.ssl.SslHandler.wrap(...)(Unknown Source)

EDIT

Я пытался создать только один экземпляр WebClient, но он по-прежнему выдает то же исключение

Ответы [ 3 ]

0 голосов
/ 06 ноября 2018

У меня возникла та же проблема, как и в упомянутом OP, это происходит под нагрузкой, но также легко вызывается перезагрузкой nginx -s, когда сервер находится под нагрузкой. Я разместил это на форуме nginx, но пока не получил ответов https://forum.nginx.org/read.php?2,281786. В моем случае я использую экземпляр синглтон-клиента для нескольких запросов, поэтому я не думаю, что комментарий Брайана применим.

0 голосов
/ 07 ноября 2018

Я узнал, что это происходит из-за этой проблемы https://github.com/reactor/reactor-netty/issues/413

Чтобы решить эту проблему, вам нужно создать WebClient так:

WebClient webClient = WebClient.builder()
               .clientConnector(new ReactorClientHttpConnector(options -> {
                   options.poolResources(PoolResources.fixed("httpPool")).compression(true);
               })).build();

вы можете изменить размер пула, вызвав PoolResources.fixed со вторым параметром

Другое решение заключается в замене этого асинхронного http-клиента на другой, подобный этому https://github.com/AsyncHttpClient/async-http-client

0 голосов
/ 04 ноября 2018

Вызов WebClient.create() многократно создает и инициализирует ресурсы HTTP несколько раз.

Без более подробной информации об этой конкретной проблеме или полной трассировке стека трудно точно определить здесь точную проблему. Но я подозреваю, что создание клиентского коннектора HTTP для каждого вызова является расточительным и может вызвать проблемы с настройкой SSL на стороне клиента.

Вы можете попробовать вместо:

WebClient webClient = WebClient.create();
// then in your for loop
webClient.post() //...

Если вы используете Spring Boot, вам следует вместо этого внедрить экземпляр WebClient.Builder и использовать его для создания экземпляра WebClient.

...