我们真的对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
是流开始处的消息。并非在所有情况下都填充它。