我想在重试次数耗尽时以编程方式退出Sping Boot 应用程序,以便永远不会错过处理任何事件。System.exit()和SpringBootApplication.exit()都不会终止应用程序。
该应用程序正在使用一个@KafkaListener
函数,该函数将事件保存到数据库,并具有一个带有客户恢复器的SeekToCurrentErrorHandler
。恢复器是我试图退出应用程序以防止Kafka偏移量被提交的地方。
该应用程序也有一个@Scheduled
功能,也许是什么阻止终止??
在谷歌上搜索这个结果是空的。我甚至不确定这是正确的方法,例如,如果在这里终止实际上会阻止偏移提交。下面是我尝试配置恢复器的代码(在Kotlin中):
fun kafkaListenerContainerFactory(
configurer: ConcurrentKafkaListenerContainerFactoryConfigurer,
kafkaConsumerFactory: ConsumerFactory<Any?, Any?>?
): ConcurrentKafkaListenerContainerFactory<*, *>? {
val factory = ConcurrentKafkaListenerContainerFactory<Any, Any>()
configurer.configure(factory, kafkaConsumerFactory)
factory.setErrorHandler(
SeekToCurrentErrorHandler(
{ _, ex ->
//System.exit(-1)
SpringApplication.exit(appContext, { -1 })
})
)
return factory
}
3条答案
按热度按时间hc2pp10m1#
也许不是完全相同的情况下,但希望仍然有用的人:我希望我的Sping Boot 应用程序在Kafka消费者停止时关闭(通常与身份验证/授权问题有关)。Spring内部事件可以用于此。我并不是说这是最好或最正确的解决方案,但经过几次尝试,这对我来说是有效的:
kx1ctssn2#
Boot 注册了一个shutdown hook,以便每当JVM退出时(例如使用
System.exit
),应用程序上下文都将关闭。关闭应用程序上下文包括停止诸如侦听器容器之类的组件;所以在那里停止它会导致几秒钟的死锁。
您应该使用类似于
ContainerStoppingErrorHandler
中的逻辑;并在停止容器后引发异常。编辑
下面是一个例子:
编辑
在2.8及更高版本中,
SeekToCurrentErrorHandler
被DefaultErrorHandler
取代。brc7rcf03#
我无法得到加里Russell的答案来停止我的应用程序,但找到了一个简单的解决方案。也许不完全“引导正确”或优雅,但它确实起作用。我所做的是注入KafkaListenerEndpointRegistry和我的SeekToCurrentErrorHandler调用: