Spring 在 ErrorMessage 中集成 null originalMessage

Spring Integration null originalMessage in ErrorMessage

我们对 Spring 集成中的错误处理感到非常困惑。我们正在使用 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 集成包装使用什么异常?文档在这里不多说,否则我们找不到任何相关内容。

更新:从 PUBSUB 更改为队列通道使其工作...

更新 2:按照 Gary 的建议,我们现在使用 payload.failed 消息,效果很好。尽管 originalMessage in ErrorMessage.

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