Spring cloud stream 处理失败时重新查询运动信息

Spring cloud stream 处理失败时重新查询运动信息,spring-cloud-stream,Spring Cloud Stream,Spring Cloud Stream Kinesis Binder是否支持如上所述的消息重新查询 在我的@StreamListener中,我抛出了一个新的org.springframework.cloud.stream.binder.RequeCurrentMessageException,但是我在我的日志中看到,org.springframework.integration.aws.inbound.kinesis.KclMessageDrivenChannelAdapter正在记录考虑对补偿

Spring Cloud Stream Kinesis Binder是否支持如上所述的消息重新查询

在我的
@StreamListener
中,我抛出了一个新的
org.springframework.cloud.stream.binder.RequeCurrentMessageException
,但是我在我的日志中看到,
org.springframework.integration.aws.inbound.kinesis.KclMessageDrivenChannelAdapter
正在记录
考虑对补偿逻辑使用“errorChannel”流,然后在日志中立即看到碎片被检查点。在阅读了关于如何使用SpringCloudStream重新查询消息的文档之后,这不是我所期望的行为。我希望Kinesis消息将被重新传递,而我的
@StreamListener
将再次处理相同的消息


目前,我们正在使用Spring Cloud Stream Kinesis Binder
2.0.1。发行版

您可能需要了解更多关于Kinesis及其工作原理的信息。只是没有一个记录。检查点是关于从碎片读取一些记录后的偏移量提交

从技术上讲,我们甚至可能根本不想检查点,我们仍然需要下一个迭代器进行处理。我们需要检查点,以防应用程序崩溃。所以,下次我们重新启动时,我们将从离开的地方继续。Kinesis流处理背后的逻辑与ApacheKafka完全相似:一些记录日志和光标在其中穿行。为了记住我们所处的位置,最好不时地存储该位置。虽然这不是强制性的

关键是,我们不单独处理来自碎片的记录:我们确实得到了一些从流中请求碎片迭代器的记录集。如果我们在该集合中的某些消息失败,并不意味着整个迭代器无法提交

作为错误处理的问题,使用Kinesis可以从特定偏移量(返回日志)重新开始消费,但我们可能会再次处理其余记录

因此,最好在目标应用程序中处理记录错误,并让Kinesis在处理偏移量时提交偏移量。错误处理程序可能会将失败的消息重新发送回同一个流,或将其存储到其他死信流中

提到的异常有以下JavaDoc:

/**
 * When using a {@code PollableMessageSource} throw this exception to cause the current
 * message to be requeued in the broker so that it will be redelivered on the next poll.
 *
 * @author Gary Russell
 * @since 2.1
 *
 */
public class RequeueCurrentMessageException extends RuntimeException {

KclMessageDrivenChannelAdapter
不可轮询,因此引发这样的异常不会有任何区别。即使我们能够以某种方式处理它,它仍然不会被重新交付,因为根据它的体系结构,在Kinesis中没有这样的东西。

如果我使用手动检查点,并且在处理消息时遇到错误时不检查点,如何确保我的
@StreamListener
在不重新启动微服务的情况下重新处理消息?下一次碎片迭代会将相同的消息重新传递给我的服务吗?我知道它也可能传递我能够成功处理的消息,我们也必须有逻辑来检测这些消息。不,不是。光标仍处于活动状态,并处于内存位置。它将向您提供下一组记录。检查点仅在重启之间相关。要重新传递失败的消息,需要从错误处理程序将其发送回该流。