Мы действительно запутались с обработкой ошибок в 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, которое работает просто отлично.Хотя есть что-то хитрое с оригинальным сообщением в сообщении об ошибке.