Batch processing 批处理的Spring云数据流反序列化错误处理

Batch processing 批处理的Spring云数据流反序列化错误处理,batch-processing,spring-kafka,spring-cloud-stream,Batch Processing,Spring Kafka,Spring Cloud Stream,我有一个关于在处理批处理时在Spring Cloud Stream中处理反序列化异常的问题(即批处理模式:true) 根据此处的文档(查看FailedFooProvider的实现),此函数似乎应该返回原始消息的子类 这里的意图是,Foo和BadFoo的列表将以原始的@StreamListener方法结束,然后由代码(即我)对它们进行分类并分别处理吗?我怀疑是这样的,正如我读到的,因为它将重新提交整个批次 如果是这种情况,那么如果应用程序通过不同的@StreamListener接收到多个消息类型,

我有一个关于在处理批处理时在Spring Cloud Stream中处理反序列化异常的问题(即
批处理模式:true

根据此处的文档(查看
FailedFooProvider
的实现),此函数似乎应该返回原始消息的子类

这里的意图是,Foo和BadFoo的列表将以原始的
@StreamListener
方法结束,然后由代码(即我)对它们进行分类并分别处理吗?我怀疑是这样的,正如我读到的,因为它将重新提交整个批次

如果是这种情况,那么如果应用程序通过不同的
@StreamListener
接收到多个消息类型,比如Foo和Bar,该怎么办。在这种情况下,value函数应该返回什么类型?下面是说明第二个问题的伪代码

@StreamListener
公共void readFoos(列出foos){
List badFoos=foos.stream()
.filter(f->f BadFoo实例)
.map(f->(BadFoo)f)
.collect(Collectors.toList());
//逻辑
}
@StreamListener
公共空白阅读栏(列表栏){
//逻辑
}
//更新为返回对象并让apply()确定子类
公共类FailedFooProvider实现函数{
@凌驾
公共对象应用(FailedDeserializationInfo信息){
if(info.getTopics().equals(“foo主题”){
返回新的BadFoo(信息);
}
else if(info.getTopics().equals(“条主题”){
返回新的BadBar(信息);
}
}
}

是,列表将包含失败反序列化的函数结果;应用程序需要处理它们

函数需要返回成功反序列化所返回的相同类型


你不能在批处理侦听器中使用条件。如果列表中混合了foo和bar,它们都会转到同一个侦听器。

请注意,
@StreamListener
长期以来一直被反对使用函数方法-。是的,对于第一个问题,我不确定你在问第二个问题,我用伪代码更新了。希望这能让问题更清晰。谢谢Gary。我已经更新了我的问题,用一个小的代码示例来说明我的第二个问题,因为我觉得我不是很清楚。我没有尝试使用条件,我只是有多个@StreamListener,它们采用不同的消息格式。只有一个值函数,我如何更新它来处理所有场景?比再次感谢您的帮助!您应该能够返回
Object
并使用主题(或其他信息)在
FailedDeserializationInfo
中确定要创建的类型。FailedDeserializationInfo对象中是否包含偏移量和分区?我在其中没有看到它们。kafka客户端未向
反序列化程序提供该信息(请参阅其javadocs)。它们在记录中可用,其值设置为函数返回的任何值。我不确定您引用的是哪条记录。我已按照您的回答进行了更新,但在readFoos中,我仍然无法看到任何元数据(对于Foos或BadFoos)