layui.open 关闭之后触发_Spring Boot 2.3 优雅关闭新姿势,真香!

50bda7873bb4a473a9be61e5983f6c05.png

最新的 Spring Boot 2.3 发布有些日子了:

其中有个新特性叫:Graceful shutdown(优雅关闭)

之前也分享过这样的文章,现在竟然出品官方姿势了,新功能嘛,肯定得去官方看下,下面是官方的说明:

Graceful shutdown is supported with all four embedded web servers (Jetty, Reactor Netty, Tomcat, and Undertow) and with both reactive and Servlet-based web applications. When a grace period is configured, upon shutdown, the web server will no longer permit new requests and will wait for up to the grace period for active requests to complete.

下面,栈长给大家总结下:

优雅关闭支持所有 4 个嵌入式 Web 服务器:Jetty, Reactor Netty, Tomcat, Undertow,以及响应式的和基于 Servlet 的 Web 应用程序。

当配置了一个优雅关闭的缓冲时间,直到应用程序关闭时,Web 服务器都不再允许接收新的请求,缓冲时间是为了等待目前所有进行中的活动请求处理完成。

需要说明的是,Tomcat、Jetty 在网络层会立即停止接收请求,而 Undertow 可以继续接收请求,但会立即返回 503 服务不可用错误。

注意:Tomcat 生效版本需要:9.0.33+

怎么开启优雅关闭?

下面是 Yaml 文件的配置示例:

# 开启优雅关闭
server:
  shutdown: graceful

# 关闭的缓冲时间
spring:
  lifecycle:
    timeout-per-shutdown-phase: 10s

源码分析

上面介绍了优雅关闭参数的配置方式,下面我们通过源码来看下默认的配置是什么。

先看第一个参数配置接收类:

org.springframework.boot.autoconfigure.web.ServerProperties

7542f6f86565e18cc9d66458d061f0bd.png
public enum Shutdown {
    GRACEFUL,
    IMMEDIATE;

    private Shutdown() {
    }
}

如源码所示,默认为:IMMEDIATE,所以优雅关闭是大家根据业务需要手动开启的。

再来看第二个参数配置接收类:

org.springframework.boot.autoconfigure.context.LifecycleProperties

1b5db068ea1791e8ed114ced7e716cb4.png

如源码所示,默认缓冲时间为:30 秒。

再看下优雅关闭的源码:

25bdfc658d25a05c834a094d46f00f26.png

根据 Graceful 可以找到几个相关的类,我们进入 Tomcat 的:

org.springframework.boot.web.embedded.tomcat.GracefulShutdown

2180013fd1a6b1fb1f4bca5c90ab6ac8.png
public enum GracefulShutdownResult {

	/**
	 * Requests remained active at the end of the grace period.
	 */
	REQUESTS_ACTIVE,

	/**
	 * The server was idle with no active requests at the end of the grace period.
	 */
	IDLE,

	/**
	 * The server was shutdown immediately, ignoring any active requests.
	 */
	IMMEDIATE;

}

REQUESTS_ACTIVE 说的是在缓冲期结束前连接保持活动状态,也就是虽然官方默认给你 30 秒的缓存时间来处理囤积请求,如果 30 秒之后还没处理完成,最后 Spring Boot 也会强制关闭应用。

所以需要注意的是,优雅关闭时一定要考虑当时的业务处理量,所设置的缓冲时间是否能处理完正在处理中的业务。

另外,Spring Boot 优雅关闭需要配合 Actuator 的 /shutdown 端点来进行触发。

好了,今天栈长就分享到了,大家可以了解学习下,对这个新特性感兴趣的朋友也可以实战测试下。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot WebSocket没有内置的心跳功能。WebSocket是一种基于TCP协议的双向通信协议,它通过建立长连接来实现实时双向数据传输的能力。与HTTP协议不同,WebSocket连接在客户端和服务器之间是持久性的,而且服务器可以主动向客户端发送消息。 由于WebSocket是基于长连接的特性,在一些情况下可能会出现连接断开的情况,如网络故障、长时间未进行通信等。为了解决这个问题,我们可以手动实现心跳功能来保持连接的活跃性。具体的做法如下: 1. 在服务端的WebSocket处理类中,创建一个定时任务,定时向客户端发送心跳消息。可以使用`ScheduledExecutorService`来实现定时任务。 2. 在客户端的JavaScript代码中,监听并处理服务端发送的心跳消息。如果客户端在一定时间内未收到心跳消息,就可以认为连接已断开,并触发相应的重连操作。 下面是一个简单的示例代码: 在服务端的WebSocket处理类中: ```java @Component public class WebSocketHandler extends TextWebSocketHandler { private WebSocketSession session; @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { this.session = session; startHeartbeat(); } private void startHeartbeat() { ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor(); executorService.scheduleAtFixedRate(() -> { try { session.sendMessage(new TextMessage("ping")); // 向客户端发送心跳消息 } catch (IOException e) { e.printStackTrace(); } }, 0, 5, TimeUnit.SECONDS); // 每5秒发送一次心跳消息 } } ``` 在客户端的JavaScript代码中: ```javascript var socket = new WebSocket("ws://localhost:8080/ws"); socket.onopen = function() { console.log("WebSocket连接已建立"); }; socket.onmessage = function(event) { if (event.data === "ping") { console.log("收到心跳消息"); } }; socket.onclose = function(event) { console.log("WebSocket连接已关闭"); // 触发重连操作 }; ``` 通过以上方式,我们可以在Spring Boot WebSocket应用中实现心跳功能,保持连接的活跃性,并在连接断开后进行相应的处理操作。但需要注意的是,由于WebSocket是基于长连接的机制,所以不建议在高并发的场景下频繁发送心跳消息,以免对服务器产生过大的负载压力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值