我们对Spring Integration中的错误处理感到困惑。我们使用的是Boot 2.0.2和Kotlin。
在X
内我们抛出异常X
。
此外,在Java DSL流程定义中,我们抛出相同的异常@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
并做一些事情。那时我们需要失败的消息。
对于MessagingExceptionWrapper
抛出的异常,原始消息就在那里。
对于从java DSL子流抛出的那个,originalMessage为null。
我们做了一些挖掘并意识到,前者包含在MessageHandlingException
中,而后者包含在 getNews(): Observable<INews[]> {
return this.http.get<INews[]>(this._url).pipe(map(res => res.json()));
}
中,其中不包含对原始邮件的引用。
有人可以帮助我们了解Spring Integration在什么情况下使用什么异常包装?文档在这里没有多说,或者我们找不到任何相关内容。
更新:从PUBSUB更改为QUEUE CHANNEL使其工作......
更新2:在Gary的建议下我们现在正在使用payload.failed消息,这很好用。虽然在ErrorMessage中使用originalMessage,但是有一些狡猾的东西。
答案 0 :(得分:1)
payload.failedMessage
是失败时的消息。 ErrorMessage.originalMessage
是流程开始时的消息。在所有情况下都没有填充。