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

怎么用wordpress布局网络网站推广优化

怎么用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.qdjiajiao.com/news/2303.html

相关文章:

  • 重庆渝北做网站哪里便宜今日新闻最新10条
  • wordpress 站群插件百度竞价搜索
  • 长沙营销网站建设公司广告营销策略有哪些
  • 庆阳平面设计招聘网知了seo
  • 宜宾网站建设多少钱整合营销传播最基础的形式是
  • 自己做头像的网站非流光怎么在百度上发表文章
  • wordpress metavalue杭州seo营销
  • 怎么在京东做网站澳门seo推广
  • 崇信县门户网站最新留言湖南百度推广开户
  • 典型营销型网站有哪些网络营销案例及分析
  • 日本做h动漫电影网站有哪些成人大专
  • 深圳网站建设网站排名优化seo服务指什么意思
  • 织梦网站如何打通百度小程序注册百度推广账号
  • 网站开发软件系统信息流广告公司排名
  • 途牛网网站是哪家公司做的惠州seo排名
  • 网站建设电脑大多怎么办广告推广免费发布
  • 手机网站建设ppt专业关键词优化平台
  • 可以在线做护理题的网站国内时事新闻
  • 无锡百度网站推广百度新闻首页头条
  • 网页传奇外挂重庆seo代理计费
  • .net开发微信网站电商运营推广是做什么的
  • 网站策划图深圳精准网络营销推广
  • 网站流量的主要来源有seo网络推广专员
  • 网站客户案例的营销软件网
  • 商标注册网上查询网下载班级优化大师并安装
  • wordpress php 模板广州seo营销培训
  • 做网站三剑客百度热搜风云榜
  • 深圳最好的营销网站建设公司怎么自己创建网站
  • 网站模版可以修改吗哪个平台可以买卖链接
  • 请人做网站要注意什么seo和sem是什么意思啊