当前位置: 首页 > news >正文

网站 js 广告代码大全安卓手机app下载软件

网站 js 广告代码大全,安卓手机app下载软件,重庆seo网络推广优化,wordpress 评论 邮箱1.背景 之前写一篇文章Spring Boot集成disruptor快速入门demo,有网友留言如下图: 针对网友的留言,那么我们如何解决这个问题呢 Spring-Boot应用停机时,如何保证其内存消息都处理完成? 2.解决方法 方法其实挺简单的&…

1.背景

之前写一篇文章Spring Boot集成disruptor快速入门demo,有网友留言如下图:

1730887217742

针对网友的留言,那么我们如何解决这个问题呢

  • Spring-Boot应用停机时,如何保证其内存消息都处理完成?

2.解决方法

方法其实挺简单的,disruptor有优雅停机方法,不用我们自己去实现逻辑,只需要调用 disruptor.shutdown() ;就可以实现优雅关闭。

1.禁用kill -9

使用kill -9命令强制终止进程在某些情况下可能会导致数据丢失或资源未正确释放。以下是一些原因和替代方案,帮助你安全地停止应用程序:

为什么避免使用kill -9
  1. 数据丢失kill -9会立即终止进程,不会给应用程序任何机会去保存数据或完成正在进行的操作。

  2. 资源泄漏:进程被强制终止后,可能无法正确释放内存、文件句柄或网络连接等资源。

  3. 不执行清理逻辑:应用程序通常在关闭时执行一些清理逻辑(如关闭数据库连接、写入日志等),kill -9会跳过这些步骤。

2.优雅停机方案

Spring Boot可以引入这个包

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

放开shutdown接口

management:endpoints:web:exposure:include: "*"endpoint:shutdown:enabled: true
server:port: 8088

然后post http://127.0.0.1:8088/actuator/shutdown 实现优雅停机,但是spring boot 2.3以下,停止后不能停止api继续对外。我们可以使用过滤器来禁止api对外提供服务,手动设置HttpServletResponse.SC_SERVICE_UNAVAILABLE

package com.et.disruptor.config;import org.springframework.stereotype.Component;import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.concurrent.atomic.AtomicBoolean;@Component
public class GracefulShutdownFilter implements Filter {private final AtomicBoolean shuttingDown = new AtomicBoolean(false);@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {if (shuttingDown.get()) {((HttpServletResponse) response).setStatus(HttpServletResponse.SC_SERVICE_UNAVAILABLE);return;}chain.doFilter(request, response);}public void startShutdown() {shuttingDown.set(true);}
}

DisposableBean是Spring框架中的一个接口,用于在Spring容器销毁Bean时执行一些自定义的清理逻辑。实现这个接口的Bean会在容器关闭时自动调用其destroy()方法。这对于需要在应用程序关闭时释放资源或执行其他清理操作的Bean非常有用。

package com.et.disruptor.config;import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;@Component
public class GracefulShutdownManager implements DisposableBean {@Autowiredprivate GracefulShutdownFilter shutdownFilter;@AutowiredMqManager mqManager;@Overridepublic void destroy() throws Exception {// reject  new  requestsshutdownFilter.startShutdown();//graceful shutdown DisruptormqManager.shutdownDisruptor(); // wait all events to complete// wait all  your self-definite task finishwaitForTasksToComplete();}private void waitForTasksToComplete() throws InterruptedException {System.out.println("Waiting for tasks to complete...");// use CountDownLatch or other//mock task processThread.sleep(100000);}
}

3.disruptor优雅关闭

如果不想显示的调用shutdown 也可以用注解@PreDestroy

package com.et.disruptor.config;import com.et.disruptor.event.HelloEventFactory;
import com.et.disruptor.event.HelloEventHandler;
import com.et.disruptor.model.MessageModel;
import com.lmax.disruptor.BlockingWaitStrategy;
import com.lmax.disruptor.RingBuffer;
import com.lmax.disruptor.dsl.Disruptor;
import com.lmax.disruptor.dsl.ProducerType;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;@Configuration
public class MqManager {private static Disruptor<MessageModel> disruptor;@Bean("ringBuffer")public RingBuffer<MessageModel> messageModelRingBuffer() {//define the thread pool for consumer message hander, Disruptor touch the consumer event to process by java.util.concurrent.ExecutorSerivceExecutorService executor = Executors.newFixedThreadPool(2);//define Event FactoryHelloEventFactory factory = new HelloEventFactory();//ringbuffer byte sizeint bufferSize = 1024 * 256;disruptor = new Disruptor<>(factory, bufferSize, executor, ProducerType.SINGLE, new BlockingWaitStrategy());//set consumer eventdisruptor.handleEventsWith(new HelloEventHandler());//start disruptor threaddisruptor.start();//gain ringbuffer ring,to product eventRingBuffer<MessageModel> ringBuffer = disruptor.getRingBuffer();return ringBuffer;}//@PreDestroypublic void shutdownDisruptor() {if (disruptor != null) {System.out.println("close Disruptor...");disruptor.shutdown(); //cl0se Disruptor}}
}

shudown方法源码

public void shutdown(long timeout, TimeUnit timeUnit) throws TimeoutException {long timeOutAt = System.currentTimeMillis() + timeUnit.toMillis(timeout);do {if (!this.hasBacklog()) {this.halt();return;}} while(timeout < 0L || System.currentTimeMillis() <= timeOutAt);throw TimeoutException.INSTANCE;
}

这里会等到所有内存消息全部处理完

private boolean hasBacklog() {long cursor = this.ringBuffer.getCursor();Sequence[] var3 = this.consumerRepository.getLastSequenceInChain(false);int var4 = var3.length;for(int var5 = 0; var5 < var4; ++var5) {Sequence consumer = var3[var5];if (cursor > consumer.get()) {return true;}}return false;
}

以上只是一些关键代码,所有代码请参见下面代码仓库

代码仓库

  • GitHub - Harries/springboot-demo: a simple springboot demo with some components for example: redis,solr,rockmq and so on.(Disruptor)

3.测试

  • 启动Spring Boot应用
  • post 请求http://127.0.0.1:8088/actuator/shutdown实现优雅停止
  • 访问http://127.0.0.1:8088/hello,会报503错误
  • 后台会等待Disruptor处理内存消息
  • 后台等待处理其他的异步任务
  • 最后关闭Spring Boot应用

4.引用

  • https://medium.com/@contact.technovisionconsulting/how-to-achieve-a-graceful-shutdown-in-spring-boot-ec93d55916ed
  • Spring Boot关闭时,如何确保内存里面的mq消息被消费完? | Harries Blog™
http://www.yayakq.cn/news/702560/

相关文章:

  • 空间设计工作室网站wordpress edd
  • 哪些企业网站做的不错瑞安网站建设电话
  • 电子商务网站建设工具上海做电缆桥架的公司网站
  • 网站开发 证书毕业设计做网站用什么
  • 网站建设顾问站建乔拓云智能建站平台
  • 温州网站建设专家使用php如何做购物网站
  • 我会编程怎么做网站二级域名免费
  • 网站做著作权永久免费手机建站平台
  • 网站关键词设置技巧网站建设小组
  • 租整套房做民宿的网站wordpress信息修改
  • 企业网站怎样做优化做购物网站数据库分析
  • 有几个网站打不开网站网页设计平台
  • 山西省住房建设厅网站下载鲅鱼圈做网站
  • 浙江理工大学网站设计与建设菜谱网站手机源码
  • 大连网站建设#选领超科技网站建设源代码
  • 成都产品网站建设seo优化推广是什么意思
  • 网站建设教程 mysqlwordpress不能实现静态化
  • 秦皇岛网站建设价格有没有专做水果网站
  • 浙江人事考试网济南seo外包公司
  • 在线做gif图网站微商网站推广怎么做
  • wordpress好优化算法
  • 创新创业网站建设网站核查怎么抽查
  • 正规不收费的网站wordpress主题 外贸网站模板下载
  • aws wordpress 免费一流的网站建设与优化
  • 百度推广费用可以退吗沧浪seo网站优化软件
  • 外贸网站建设制作教程wordpress mysql数据库
  • thinkphp做网站快吗赣州网站建设需要多少钱
  • 网站开发个人所得税海外网站建设
  • 深圳网站设计 建设首选深圳市wordpress创建文档系统
  • 石家庄网站建设解决方案常用的网络营销工具