У меня есть простой сервер, который обрабатывает некоторые очень простые c сообщения и возвращает сообщение об ошибке, если есть проблема. Однако, когда возвращается сообщение об ошибке mono, соединение закрывается до того, как логика onErrorResume c может быть завершена (я вижу, что соединение закрывается до регистрации onErrorResume).
Вот код в вопрос, где session
является WebSocketSession
:
session.send(
session.receive()
.map(messageConverter::read)
.flatMap { messageHandlerStrategy.handle(it, session) }
.onErrorResume {
logger.error(it) { "Error happened handling message from client with the message" }
if (it.message != null) {
AlertMessage(it.message!!)
} else {
AlertMessage("Unknown error occurred")
}.toMono()
}
.filter {
logger.info { "Filtering if is Message: ${it is Message<Any>}" }
it is Message<Any>
}
.cast(Message::class.java)
.map { messageConverter.write(session, it) }
.doFinally { logger.info { "${session.id} CLOSE." } }
.log()
)
Так что, если messageHandlerStrategy
возвращает Mono.error
, ожидается, что оно будет заключено в AlertMessage и возвращено.
Для ясности я использую Kotlin с Spring Boot 2.2.4.RELEASE и позволяю ему вводить правильные версии всего (например, reactor-core-3.3.2.RELEASE
).