我正在使用spring kafka 1.2.2.RELEASE。目前,我已为没有BackOffPolicy和AlwaysRetryPolicy的容器配置了重试模板。确认模式为MANUAL_IMMEDIATE。
当一个SIGTERM时,我将让当前消息被处理,并且当用新消息再次调用@KafkaListener时,我会在无限期重试并且连续抛出异常的容器上抛出RuntimeException。一段时间后发出SIGKILL并停止容器(我认为有更好的方法)。但是在此过程中,重新启动的消息将在消费者重新启动后检索,但在不调用KafkaListener的情况下提交。请参见下面的堆栈跟踪中的offset = 13
堆栈追踪:
[20 May 2018 22:37:20] [ INFO] [] [ConsumerCoordinator onJoinComplete]:[262 ] - Setting newly assigned partitions [messages-0] for group listener
[20 May 2018 22:37:20] [DEBUG] [] [KafkaMessageListenerContainer$ListenerConsumer$2 onPartitionsAssigned]:[513 ] - Committing on assignment: {messages-0=OffsetAndMetadata{offset=13, metadata=''}}
[20 May 2018 22:37:20] [ INFO] [] [AbstractMessageListenerContainer$2 onPartitionsAssigned]:[278 ] - partitions assigned:[messages-0]
[20 May 2018 22:37:20] [DEBUG] [] [KafkaMessageListenerContainer$ListenerConsumer run]:[632 ] - Received: 0 records
[20 May 2018 22:37:20] [DEBUG] [] [KafkaMessageListenerContainer$ListenerConsumer run]:[632 ] - Received: 1 records
[20 May 2018 22:37:20] [TRACE] [] [KafkaMessageListenerContainer$ListenerConsumer doInvokeWithRecords]:[931 ] - Processing ConsumerRecord(topic = messages, partition = 0, offset = 13, CreateTime = 1526855737241, serialized key size = 31, serialized value size = 2032, headers = RecordHeaders(headers = [], isReadOnly = false), key = "some key", value = "some random data")
[20 May 2018 22:37:20] [DEBUG] [] [KafkaMessageListenerContainer$ListenerConsumer ackImmediate]:[749 ] - Committing: {messages-0=OffsetAndMetadata{offset=14, metadata=''}
当我看到发出SIGTERM时,是否有更好的方法来停止容器,因此不会使用消息调用@KafkaListener。我知道spring-kafka的更高版本(> 2.0.0)具有可以阻止所有消费者的KafkaListenerEndpointRegistry。但目前无法升级到2.0.0。
非常感谢任何帮助。
答案 0 :(得分:0)
端点注册表自1.0以来一直存在。 1.x用户建议升级到最新的1.3.x;见here。
当从侦听器停止容器时,最好在新线程上执行此操作,否则停止将停止。
有关如何执行此操作,请参阅2.1.x ContainerStoppingErrorHandler。但是,当然,停止后不需要抛出异常。
但是使用1.x,您将需要丢弃已经获取的任何后续消息。