Spring kafka:Kafka Listener- consumer.seek问题

时间:2017-11-02 15:49:11

标签: spring-kafka

我们正在使用Spring KafkaListener,它会在处理完DB后确认每条记录。如果我们在写入DB时遇到问题,我们不会对记录进行确认,因此不会为消费者提交抵消。这很好用。现在我们想在下次轮询中获取失败的消息以重试它们。我们将错误处理程序添加到我们的侦听器并调用了ConsumerAwareListenerErrorHandler,并尝试对失败的消息偏移量执行consumer.seek()。期望是在下次调查期间,我们应该收到失败的消息。这不会发生。下一轮询仅提取新消息而不是失败消息,下面给出了代码片段。

cbFileType.Items.Add(new BoolStringClass { Name = ".jpg", IsChecked = true });
cbFileType.Items.Add(new BoolStringClass { Name = ".bmp", IsChecked = false });

foreach (var selectedItem in cbFileType.Items.OfType<BoolStringClass>().Where(x => x.IsChecked))
    cbFileType.SelectedItems.Add(selectedItem);

2 个答案:

答案 0 :(得分:0)

它应该像这样工作:

如果要丢弃先前轮询中的其他记录,则错误处理程序需要抛出异常。

因为你正在处理&#34;错误,容器一无所知,并将继续使用轮询中的剩余记录调用侦听器。

也就是说,我看到容器也忽略了错误处理程序抛出的异常(如果错误处理程序抛出Error而不是异常,它将丢弃)。我会为此开一个问题。

另一种解决方法是将Consumer添加到侦听器方法签名并在那里进行搜索(并抛出异常)。如果没有错误处理程序,则会丢弃批处理的其余部分。

<强>校正

如果容器没有ErrorHandlerThrowable引发的任何ListenerErrorHandler将导致剩余记录被丢弃。

答案 1 :(得分:0)

请尝试使用SeekToCurrentErrorHandler。该文档说:“这使实现可以查找所有未处理的主题/分区,因此下次记录将检索当前记录(以及其余的其余记录)。SeekToCurrentErrorHandler正是这样做的。

容器将在调用错误处理程序之前提交所有未决的偏移量提交。” https://docs.spring.io/autorepo/docs/spring-kafka-dist/2.1.0.BUILD-SNAPSHOT/reference/htmlsingle/#_seek_to_current_container_error_handlers