#spring-webclient #spring-reactor
#spring-webflux #spring-webclient #reactor-netty
Вопрос:
В Kibana нашего приложения я продолжаю видеть эту строку журнала из org.springframework.web.reactive.function.client.ExchangeFunctions
:
[2f5e234b] Cancel signal (to close connection)
Поток reactor-http-epoll-1
или около того.
Это может произойти в двух ситуациях:
- когда соединение успешно и возвращает ответ, тогда это не имеет значения
- когда по какой-то неизвестной причине через 10 секунд соединение ничего не возвращает, и эта строка также происходит, и точка, больше ничего. Кажется, это тайм-аут, но я не уверен (потому что тайм-аут по умолчанию в моей конфигурации WebClient равен 10 секундам)
Что может быть причиной этого? Активный сброс клиента или активный отказ сервера?
Является ли второй случай таймаутом? Но не TimeoutException()
выдается впоследствии.
Сейчас я doOnCancel()
регистрируюсь в WebClient, чтобы разобраться со 2-м случаем, но затем я замечаю, что есть случай 1, и эта doOnCancel()
обработка больше не имеет смысла, потому что это, кажется, происходит во всех случаях.
Комментарии:
1. У вас есть объяснение? потому что у меня тот же журнал…
2. Пока нет, запрос в режиме ожидания в нашем бэклоге. Я думаю, что это клиент, закрывающий соединение, потому что это происходит в любом случае.
3. нашел что-нибудь новое? получил ту же проблему через 60 секунд, что действительно странно, так это то, что я не могу воспроизвести эту проблему локально, это происходит только внутри модуля k8s
4. Я думаю, что клиент закрывает соединение при получении данных до истечения времени ожидания или просто по истечении времени ожидания. Например, для моего webclient в Spring Boot время ожидания по умолчанию составляет 5 секунд, и журналы показывают, что сигнал отмены происходит не более чем через 5 секунд.
5. Удалось ли вам решить эту проблему?
Ответ №1:
У меня тот же журнал. Но в моем WebClient я вернул Mono.empty(), а сигнатура метода была Mono< Void> . После изменения на Mono< String> проблема исчезла.
Комментарии:
1. Ну, Mono.empty() также является Mono<T> . Похоже, что ваша подпись является Object, но вы возвращаете null. Это то, что вы хотели сказать?
2. Сигнатура метода была Mono<Void> .