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

桂林 网站建站关键词提取

桂林 网站建站,关键词提取,卧龙区微网站建设,做的电影网站很卡背景最近项目在jenkins部署的时候发现部署很慢&#xff0c;查看部署日志发现kill命令执行后应用pid还存在&#xff0c;导致必须在60秒等待期后kill -9杀死springboot进程 应用环境 springboot <dependency><groupId>org.springframework.boot</groupId>&l…

背景最近项目在jenkins部署的时候发现部署很慢,查看部署日志发现kill命令执行后应用pid还存在,导致必须在60秒等待期后kill -9杀死springboot进程

应用环境

  • springboot
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><version>2.6.3</version>
</dependency>
  • springcloud
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2021.0.1.0</version><type>pom</type><scope>import</scope>
</dependency>
  • 监控
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId><version>2.6.3</version>
</dependency>

原因分析

  • 通过将全部日志调整为debug级别,观察到有个定时任务线程在不断执行,例子如下
@SpringBootApplication
@MapperScan("com.test.test.mapper")
public class TestApplication implements CommandLineRunner {static ScheduledExecutorService executor;public static void main(String[] args) {executor = Executors.newScheduledThreadPool(1);SpringApplication.run(TestApplication.class, args);}private static void run(ScheduledExecutorService executor) {executor.scheduleAtFixedRate(() -> {System.out.println("run");}, 0, 1, TimeUnit.SECONDS);@Overridepublic void run(String... args) throws Exception {run(executor);}
}

上述代码中,由于线程定义默认是非守护线程,执行优雅停机后,在用户线程停止后,非守护线程不会自动停止
在这里插入图片描述

在这里插入图片描述

解决办法

  1. 定义为守护线程
    对于非业务逻辑,例如监控数据上传,日志记录,这样做非常方便,但对于系统业务,这么做会导致未执行完成任务被丢弃。
  2. 将线程池定义为springbean,交予spring容器管理其生命周期
@SpringBootApplication
@MapperScan("com.test.test.mapper")
public class TestApplication implements CommandLineRunner {public static void main(String[] args) {SpringApplication.run(TestApplication.class, args);}private static void run(ScheduledExecutorService executor) {executor.scheduleAtFixedRate(() -> {System.out.println("run");}, 0, 1, TimeUnit.SECONDS);}@Beanpublic ScheduledExecutorService executor() {return Executors.newScheduledThreadPool(1);}@Overridepublic void run(String... args) throws Exception {ScheduledExecutorService executor = SpringUtil.getBean(ScheduledExecutorService.class);run(executor);}
}

效果
在这里插入图片描述弊端:此类方式中,由于线程池的工作线程属于非守护线程,应用会等待所有任务执行完成后才关闭。由于容器已经关闭,数据库连接池已经释放,这时候任务再获取spring容器内容会报错,因此这种方案只适用于用户日志记录,监控等非业务功能,效果如下:

@SpringBootApplication
@MapperScan("com.test.test.mapper")
@Slf4j
public class TestApplication implements CommandLineRunner {public static void main(String[] args) {SpringApplication.run(TestApplication.class, args);}private static void run(ExecutorService executor) {executor.execute(() -> {log.info("=====start");try {TimeUnit.SECONDS.sleep(25);User user = SpringUtil.getBean(IUserService.class).findById(10L);log.info("用户信息:" + user);} catch (Exception ex) {ex.printStackTrace();}log.info("=========end");});}@Beanpublic ExecutorService executor() {return new ThreadPoolExecutor(10, 10, 10, TimeUnit.SECONDS,new ArrayBlockingQueue<>(1),r -> {Thread thread =new Thread(r);return thread;},new ThreadPoolExecutor.DiscardOldestPolicy());}@Overridepublic void run(String... args) throws Exception {ExecutorService executor = SpringUtil.getBean(ExecutorService.class);run(executor);}
}

在这里插入图片描述

3.使用spring提供的ThreadPoolTaskExecutor线程池

@SpringBootApplication
@MapperScan("com.test.test.mapper")
@Slf4j
public class TestApplication implements CommandLineRunner {public static void main(String[] args) {SpringApplication.run(TestApplication.class, args);}private static void run(ThreadPoolTaskExecutor executor) {executor.execute(() -> {log.info("=====start");try {TimeUnit.SECONDS.sleep(25);User user = SpringUtil.getBean(IUserService.class).findById(10L);log.info("用户信息:" + user);} catch (Exception ex) {ex.printStackTrace();}log.info("=========end");});}@Beanpublic ThreadPoolTaskExecutor executor() {int core = Runtime.getRuntime().availableProcessors();ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(core > 3 ? core >> 1 : core);int maxSize = core + 2;executor.setMaxPoolSize(maxSize);//使用同步队列,避免任务进入等待队列排队导致耗时过长executor.setQueueCapacity(0);executor.setKeepAliveSeconds(30);executor.setWaitForTasksToCompleteOnShutdown(true);executor.setAwaitTerminationSeconds(25);executor.setThreadNamePrefix("async-");executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());executor.initialize();return executor;}@Overridepublic void run(String... args) throws Exception {ThreadPoolTaskExecutor executor = SpringUtil.getBean(ThreadPoolTaskExecutor.class);run(executor);}
}

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
从上图可以看到,应用会等待线程池任务执行完毕后才选择优雅关闭,因此对于异步业务任务,ThreadPoolTaskExecutor才是首选。
spring已经内置了ThreadPoolTaskExecutor 线程池实例,我们可以尝试修改其配置参数,简化代码来尝试,例如:
在这里插入图片描述

spring:task:execution:pool:queue-capacity: 0core-size: 2max-size: 16keep-alive: 30sthread-name-prefix: 'async-'shutdown:await-termination: trueawait-termination-period: 25s
@SpringBootApplication
@MapperScan("com.test.test.mapper")
@Slf4j
public class TestApplication implements CommandLineRunner {public static void main(String[] args) {SpringApplication.run(TestApplication.class, args);}private static void run(ThreadPoolTaskExecutor executor) {executor.execute(() -> {log.info("=====start");try {TimeUnit.SECONDS.sleep(25);User user = SpringUtil.getBean(IUserService.class).findById(10L);log.info("用户信息:" + user);} catch (Exception ex) {ex.printStackTrace();}log.info("=========end");});}@Overridepublic void run(String... args) throws Exception {ThreadPoolTaskExecutor executor = SpringUtil.getBean(ThreadPoolTaskExecutor.class);run(executor);}
}

效果与上述手动创建效果一样,但是内置的ThreadPoolTaskExecutor线程池无法通过配置修改拒绝策略rejectedExecutionHandler,队列满了之后默认是AbortPolicy,会丢弃加入的任务并抛异常,spring内置此线程池的初衷在于为定时任务使用,例如@Scheduled。
在这里插入图片描述
在这里插入图片描述

http://www.dtddedu.com/news/536.html

相关文章:

  • 网站的链接结构怎么做福州网站seo
  • 网站动态url与静态url读取速度宁波seo整体优化
  • 简洁大气国内企业网站千度搜索引擎
  • 网页制作全部过程seo是什么意思如何实现
  • 上海做b2b国际网站公司深圳网络运营推广公司
  • 蜘蛛不抓取网站的原因精准营销的概念
  • 怎么开网店做电商平台关键词排名优化
  • 网络推广服务合同范本大全免费版网站seo站长工具
  • 手机网站建设深圳seo推广方案怎么做
  • 国内网站百度seo排名优化费用
  • 企业注册百家号可以做网站吗微信推广平台怎么做
  • 建立目录wordpressseo排名分析
  • 怎样做网站策划seo入门书籍
  • wordpress多地址成都seo的方法
  • 厦门市做网站优化企业品牌网站营销
  • 网站群建设的必要性网络文章发布平台
  • 专门做茶叶会的音乐网站网站快速优化排名app
  • 金融网站设计方向关键词完整版
  • 免费建个人手机网站seo如何优化关键词排名
  • 网站建设领导小组收录网站查询
  • 建设网站需要学什么程序电商平台有哪些
  • 上海网站建设要多少钱seo网站关键词优化工具
  • 专业网站建设网页推广企业培训课程名称大全
  • 姜堰 做网站seo求职
  • 嘟嘟嘟视频在线观看免费搜索引擎优化排名技巧
  • 沈阳口碑最好的男科医院惠州关键词排名优化
  • 江西省建设质量监督局网站营销推广方式有哪些
  • 网站数据库分离怎么做免费注册个人网站
  • 广州 网站开发 骏域宁海关键词优化怎么优化
  • import wordpress网站手机版排名seo