Обработка исключений с помощью Spring Boot без REST - PullRequest
0 голосов
/ 18 марта 2020

Я использую 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.

...