Spring Integration null originalMessage в ErrorMessage - PullRequest
0 голосов
/ 17 мая 2018

Мы действительно запутались с обработкой ошибок в Spring Integration.Мы используем Boot 2.0.2 и Kotlin.

В пределах @Transformer мы выдаем исключение X.

Кроме того, в определении потока Java DSL мы выдаем то же исключение X

Каналы

@Bean(TO_BE_PROCESSED_CHANNEL)
fun toBeProcessed() = PublishSubscribeChannel(defaultExecutor())

Поток

@Configuration
class VideoDescriptorPersistSubflow(
    val videoRepository: JdbcVideoRepository,
    val ingestRecordRepository: CustomIngestRecordRepository
) {

@Bean
fun videoDescriptorPersistFlow(
        toBeProcessed: MessageChannel,
        processedVideos: MessageChannel
) =
        IntegrationFlows.from(toBeProcessed)
                .filter { message: Message<*> -> message.ingestRecordId() != null }
                .handle { videoDescriptor: VideoDescriptor, _ -> validateVideoDescriptor(videoDescriptor) }
                .handle { videoDescriptor: VideoDescriptor, _ -> videoRepository.persist(videoDescriptor) }
                .channel(processedVideos)
                .get()

fun validateVideoDescriptor(videoDescriptor: VideoDescriptor): VideoDescriptor {
    val errors = VideoDescriptorValidator().validate(videoDescriptor)
    if (errors.isNotEmpty()) {
        throw VideoMetadataValidationException(errors)
    }

    return videoDescriptor
}

Позжев errorChannel мы отфильтровываем X и делаем некоторые вещи.В этот момент нам нужно сообщение об ошибке .

Для исключения, выданного @Transformer, имеется исходное сообщение.

Для сообщения, выброшенного из подпотока Java DSL, originalMessage равно null.

Мы провели некоторое копание и поняли, что первый обернут в MessagingExceptionWrapper, тогда как последний обернут в MessageHandlingException, который не содержит ссылку на исходное сообщение.

Может кто-нибудь помочь нам понять, при каких обстоятельствах Spring Integration использует какие исключения?Документы здесь мало что говорят, или мы не можем найти что-то релевантное.

ОБНОВЛЕНИЕ: ИЗМЕНЕНИЕ ОТ PUBSUB НА QUEUE КАНАЛ ДЕЛАЕТ ЭТО РАБОТАЕТ ...

ОБНОВЛЕНИЕ 2: Следуя указаниям Гэри, мы теперь используем сообщение payload.failed, которое работает просто отлично.Хотя есть что-то хитрое с оригинальным сообщением в сообщении об ошибке.

1 Ответ

0 голосов
/ 17 мая 2018

payload.failedMessage - это сообщение во время сбоя. ErrorMessage.originalMessage - это сообщение в начале потока. Он не заполнен во всех случаях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...