Spring Integration在ErrorMessage中为null originalMessage

时间:2018-05-17 17:43:58

标签: java kotlin spring-integration spring-integration-dsl

我们对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,但是有一些狡猾的东西。

1 个答案:

答案 0 :(得分:1)

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