Spring Boot - 延迟启动的关闭挂钩,直到我的关闭挂钩完成

时间:2018-04-16 17:59:30

标签: java spring spring-boot

我在负载均衡器后面的两台服务器上运行了一个spring boot应用程序。

我已经定义了一个关闭挂钩,它将我的应用程序中的/ healthcheck端点设置为返回404错误,等待30秒以完成所有操作,然后暂停JVM。负载均衡器配置为在服务器看到404错误时将其置于维护模式。 (这与“DOWN”状态不同 - 允许在维护模式下完成飞行中连接)

问题是负载均衡器永远不会看到那些404响应。相反,它会拒绝第4层TCP连接,将服务器置于负载均衡器上的DOWN状态。我认为这是因为其他一个关闭钩子(可能是Spring,Boot或Tomcat)正在删除TCP绑定。

在调用任何其他关闭挂钩之前,是否可以确保我的关闭挂钩运行完成,或者我是否需要更改我的init脚本以在运行状况检查中设置404状态并在停止之前等待30秒这个过程?

2 个答案:

答案 0 :(得分:0)

关机挂钩是线程。我看不出你如何执行任何执行命令

答案 1 :(得分:0)

我从未弄清楚如何使用关闭钩子处理这个问题。

我为解决问题所做的是添加一个带有URL路径“/ lbdisable”的端点,这会导致“/ healthcheck”端点返回404错误。

在init脚本中,我用curl调用“http://127.0.0.1:PORT/lbdisable”,等待40秒,然后终止该程序。在运行状况检查上从200切换到404会导致负载平衡器将服务器置于维护模式。该模式允许完成正在进行的请求,同时确保不向服务器发送新请求。

通过这些更改,我现在可以在两台服务器上重启程序,重启之间有两分钟的延迟。客户不知道任何事情已经失败,并且没有任何损失。