我想优雅地关闭
SpringBoot
应用程序。
该应用程序有多个 ThreadPools
并进行 async
处理。
它连接到 DB
和消息总线。
关闭时,我在
application.yaml
或 application.properties
配置中添加了以下内容:
server.shutdown=graceful
此正常关闭功能仅适用于 Tomcat
、Jetty
和 Undertow
服务器。
它应该对由
destroy()/shutdown()
上下文处理的所有适当的 beans 调用 Spring
方法。
由于我的应用程序使用
JMS
-embedded
队列进行一些处理,因此我有一个自定义实现来检查在关闭应用程序之前所有队列是否为空。
需要指出的是,部署机制将在调用关闭过程之前从平衡器中删除实例,因此这是其他传入请求的安全机制。
关闭应用程序时您还会检查什么吗?
您是否有过在应用程序关闭时未完成的
HTTP
或 RMI
调用出现异常的经历?
抱歉这个问题不太具体,但我想听听经验。
我已经添加了从当前故障排除中获得的所有信息,因此如果它对某人有帮助,我也很高兴。
干杯
使用具有事务功能的数据库可以防止微服务周围的许多问题。
但是如果您使用 webflux,异步功能和事务数据库驱动程序有点混乱,因为它是一个相对较新的编程范例(仅自 2015-2020 年以来实现)。
处理事情的方法:在实体中添加一个
version
字段,并在每次仅针对 version+1 提交事情之前检查它。一些 API(如 JPA)及其 impl(如 Hibernate)正在使用带注释的字段为您检查这一点。
另一种途径是在发生停机时使用所发出的请求进行编程回滚。这就是为什么事件存储库可能是执行|重做|撤消任何事件的一个非常好的主意,包括任何队列中的任何事件:rabbitmq、activemq、kafka 和其他替代方案。