Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ErrorMessage中的Spring集成空原始消息_Java_Kotlin_Spring Integration_Spring Integration Dsl - Fatal编程技术网

Java ErrorMessage中的Spring集成空原始消息

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

我们对Spring集成中的错误处理感到非常困惑。我们正在使用boot2.0.2和Kotlin

@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
}