我们真的对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到队列通道的工作...

更新2:在加里(Gary)的劝说下,我们现在使用的是payload.failed消息,它工作正常。虽然在ErrorMessage中的originalMessage还是有些疑惑。

最佳答案

payload.failedMessage是失败时的消息。 ErrorMessage.originalMessage是流开始处的消息。并非在所有情况下都填充它。

10-08 17:39