Java ErrorMessage中的Spring集成空原始消息
我们对Spring集成中的错误处理感到非常困惑。我们正在使用boot2.0.2和Kotlin 在Java ErrorMessage中的Spring集成空原始消息,java,kotlin,spring-integration,spring-integration-dsl,Java,Kotlin,Spring Integration,Spring Integration Dsl,我们对Spring集成中的错误处理感到非常困惑。我们正在使用boot2.0.2和Kotlin 在@Transformer中,我们抛出一个异常X 另外,在JavaDSL流定义中,我们抛出相同的异常X 渠道 @Bean(TO_BE_PROCESSED_CHANNEL) fun toBeProcessed() = PublishSubscribeChannel(defaultExecutor()) 流动 @配置 类VideoDescriptorPersistSubflow( val videoRep
@Transformer
中,我们抛出一个异常X
另外,在JavaDSL流定义中,我们抛出相同的异常X
渠道
@Bean(TO_BE_PROCESSED_CHANNEL)
fun toBeProcessed() = PublishSubscribeChannel(defaultExecutor())
流动
@配置
类VideoDescriptorPersistSubflow(
val videoRepository:JdbcVideoRepository,
val ingestRecordRepository:CustomIngestRecordRepository
) {
@豆子
有趣的视频描述符PersistFlow(
toBeProcessed:MessageChannel,
processedVideos:MessageChannel
) =
集成流。从(到处理)
.filter{message:message->message.ingestRecordId()!=null}
.handle{videoDescriptor:videoDescriptor,\ u->validateVideoDescriptor(videoDescriptor)}
.handle{videoDescriptor:videoDescriptor,->videoRepository.persist(videoDescriptor)}
.频道(已处理视频)
.get()
视频描述符(videoDescriptor:videoDescriptor):视频描述符{
val errors=VideoDescriptorValidator().validate(videoDescriptor)
if(errors.isNotEmpty()){
抛出VideoMetadataValidationException(错误)
}
返回视频描述符
}
稍后在errorChannel
中,我们过滤掉X
并执行一些操作。此时我们需要失败的消息
对于@Transformer
引发的异常,原始消息就在那里
对于从JavaDSL子流抛出的消息,原始消息为null
我们做了一些挖掘并意识到,前者被包装在MessaginExceptionWrapper
中,而后者被包装在MessageHandlingException
中,其中不包含对原始消息的引用
请有人帮助我们了解在什么情况下Spring Integration使用了什么异常?这里的文档没有说太多,或者我们找不到任何相关内容
更新:从PUBSUB更改为队列频道使其工作…
更新2:根据Gary的建议,我们现在使用payload.failed消息,它工作得很好。ErrorMessage中的原始消息有些可疑。
有效负载。failedMessage
是失败时的消息。ErrorMessage.originalMessage
是流开始时的消息。并非在所有情况下都会填充。您需要显示这两种情况下的配置以及集成流DSL之前的内容。感谢@GaryRussell,我真的希望您在场。将aChannel从带有执行器的PubSub更改为队列可以使其工作……让我在此处添加更多配置(尽管,基本上就是这样)但是org.springframework.messaging.support.ErrorMessage只包含originalMessage。我们在从errorQueue中提取消息后转换为该消息……通常,ErrorMessage.payload.failedMessage
是最相关的。ErrorMessage.originalMessage
(捕获异常的消息)在很多情况下,当它可用时会添加。如果您显示您的配置,我们可以确定它是否是错误。
@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
}