我正在用kafka实现某种延迟队列。春季kafka侦听器容器针对某个主题(例如t1)收到的每条消息都应延迟一定时间(例如d分钟),然后将msg发送回另一个主题(例如t2)。 目前,我正在春季的Kafka侦听器容器方法(AcknowledgingConsumerAwareMessageListener)中进行此操作:
我了解心跳线程是一个不同的线程,不会受到上述步骤的影响,但是轮询发生在与处理相同的线程中,并且在处理记录之后as per this answer。我已经将我的@KafkaListener属性设置为“ max.poll.interval.ms = 2xd”,这样它就不会超时,但是我从KafkaEventListener中获得了NonResponsiveConsumerEvent(带有timeSinceLastPoll)。即使我没有为@KafkaListener属性设置max.poll.interval.ms,我仍然会得到相同的NonResponsiveConsumerEvent。在这两种情况下,该消息仅处理一次并发送到t2。
问题
版本:Spring Boot 2.1.8,Spring Kafka 2.2.8
答案 0 :(得分:0)
必要时睡d分钟
您不能使使用者线程“休眠”超过(*ACCEPT)
。
暂停容器的整个目的是使其继续max.poll.interval.ms
(但是直到恢复它都不会获得任何新记录)。
如果您实际上使听众入睡,则暂停是没有意义的。您只需要适当增加poll
。