Я использую Spring Boot 2.1.13.RELEASE с Kotlin
Я внедряю службу, которая поддерживает только MQTT без REST.
Что мне нужно: если выдается исключение, зарегистрируйте его в консоли и дождитесь следующего сообщения MQTT.
build.gradle.kts:
// spring boot
implementation("org.springframework.boot:spring-boot-starter-web")
// kotlin
implementation("org.jetbrains.kotlin:kotlin-reflect")
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
// misc
implementation("com.fasterxml.jackson.core:jackson-databind:2.10.2")
implementation("com.fasterxml.jackson.core:jackson-core:2.10.2")
implementation("com.fasterxml.jackson.core:jackson-annotations:2.10.2")
implementation("com.hivemq:hivemq-mqtt-client:1.1.2")
// logging
implementation("org.springframework.boot:spring-boot-starter-log4j2")
ExceptionController:
@ControllerAdvice
@RestController
class ExceptionController {
private val logger = LoggerFactory.getLogger(javaClass.name)
@ExceptionHandler(Exception::class)
fun handleException(exception: Exception) {
logger.error("Caught '${exception.javaClass.kotlin}' - Error: '${exception.localizedMessage}'")
}
}
Пользовательское исключение:
class CacheValueNotFoundException(message: String): RuntimeException(message)
Мой пользовательский контроллер исключений не работает, потому что я не использую REST-контроллер, но использую MQTT:
io.reactivex.exceptions.UndeliverableException: исключение не может быть доставлено потребителю, поскольку оно уже отменило / утилизировало поток или исключение не имело места для go для начала. Дальнейшее чтение: https://github.com/ReactiveX/RxJava/wiki/What 's-different-in-2.0 # обработка ошибок
Я пытался установить собственный обработчик ошибок Rx Java, который ничего не должен делать:
@EnableCaching
@EnableAsync
@SpringBootApplication
class Application
fun main() {
RxJavaPlugins.setErrorHandler {
return@setErrorHandler
}
runApplication<Application>()
}
Но он блокирует приложение и больше не обрабатывает входящие сообщения MQTT.