Сигнал отмены (закрыть соединение) в чем может быть причина?

#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> .