SpringBoot项目@Async方法问题解决方案

现象:

1. 表面现象: 方法中输出的日志, 日志文件中找不到, 也没有任何报错(即@Async标注的方法没有执行, 也没有报错)

2. 分析现象: 日志中某个时刻之后没有了task-xxx线程的日志

原因:

@Async异常方法默认使用Spring创建ThreadPoolTaskExecutor(参考TaskExecutionAutoConfiguration),

其中默认核心线程数为8, 默认最大队列和默认最大线程数都是Integer.MAX_VALUE. 创建新线程的条件是队列填满时, 而这样的配置队列永远不会填满, 如果有@Async注解标注的方法长期占用线程(比如HTTP长连接等待获取结果), 在核心8个线程数占用满了之后, 新的调用就会进入队列, 外部表现为没有执行.

解决:

手动配置相应属性即可. 比如

spring.task.execution.pool.queueCapacity=4
spring.task.execution.pool.coreSize=20

备注:

此处没有配置maxSize, 仍是默认的Integer.MAX_VALUE. 如果配置的话, 请考虑达到最大线程数时的处理策略(JUC包查找RejectedExecutionHandler的实现类)

(默认为拒绝执行AbortPolicy, 即抛出异常)

AbortPolicy: 直接抛出java.util.concurrent.RejectedExecutionException异常

CallerRunsPolicy: 主线程直接执行该任务,执行完之后尝试添加下一个任务到线程池中,可以有效降低向线程池内添加任务的速度

DiscardOldestPolicy: 抛弃旧的任务

DiscardPolicy: 抛弃当前任务

截图:

1. ThreadPoolTaskExecutor

2. SpringMonitor的配置属性

3. SpringMonitor的Threads

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 简述Springboot @Async 异步方法

    1.异步调用 异步调用就是在不阻塞主线程的情况下执行高耗时方法 2.常规异步 通过开启新线程实现 3.在Springboot中启用异步方法 需要4个注解 1.@EnableAsync 开启异步 2.@Component 注册异步组件 3.@Async 标注异步方法 4.@Autowired 注入异步组件 4.进行一次异步调用 1.首先在一个Config类上标注开启异步 2.然后创建一个异步的组件类,就跟Service,Controller 一样一样的,用Component标注,Service也行

  • 详解Spring/Spring boot异步任务编程WebAsyncTask

    今天一起学习下如何在Spring中进行异步编程.我们都知道,web服务器处理请求 request 的线程是从线程池中获取的,这也不难解释,因为当web请求并发数非常大时,如何一个请求进来就创建一条处理线程,由于创建线程和线程上下文切换的开销是比较大的,web服务器最终将面临崩溃.另外,web服务器创建的处理线程从头到尾默认是同步执行的,也就是说,假如处理线程A负责处理请求B,那么当B没有 return 之前,处理线程A是不可以脱身去处理别的请求的,这将极大限制了web服务器的并发处理能力. 因此

  • Spring Boot利用@Async异步调用:使用Future及定义超时详解

    前言 之前连续写了几篇关于使用@Async实现异步调用的内容,也得到不少童鞋的反馈,其中问题比较多的就是关于返回Future的使用方法以及对异步执行的超时控制,所以这篇就来一起讲讲这两个问题的处理. 如果您对于@Async注解的使用还不了解的话,可以看看之前的文章,具体如下: 使用@Async实现异步调用 使用@Async实现异步调用:自定义线程池 使用@Async实现异步调用:资源优雅关闭 定义异步任务 首先,我们先使用@Async注解来定义一个异步任务,这个方法返回Future类型,具体如下

  • Spring Boot @Async 异步任务执行方法

    1.任务执行和调度 Spring用TaskExecutor和TaskScheduler接口提供了异步执行和调度任务的抽象. Spring的TaskExecutor和java.util.concurrent.Executor接口时一样的,这个接口只有一个方法execute(Runnable task). 1.1.TaskExecutor类型 Spring已经内置了许多TaskExecutor的实现,你没有必要自己去实现: SimpleAsyncTaskExecutor  这种实现不会重用任何线程,

  • Spring Boot利用@Async异步调用:ThreadPoolTaskScheduler线程池的优雅关闭详解

    前言 之前分享了一篇关于Spring Boot中使用@Async来实现异步任务和线程池控制的文章:<Spring Boot使用@Async实现异步调用:自定义线程池>.由于最近身边也发现了不少异步任务没有正确处理而导致的不少问题,所以在本文就接前面内容,继续说说线程池的优雅关闭,主要针对ThreadPoolTaskScheduler线程池. 问题现象 在上篇文章的例子Chapter4-1-3中,我们定义了一个线程池,然后利用@Async注解写了3个任务,并指定了这些任务执行使用的线程池.在上文

  • Spring boot注解@Async线程池实例详解

    这篇文章主要介绍了Spring boot注解@Async线程池实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 从Spring3开始提供了@Async注解,该注解可以被标注在方法上,以便异步地调用该方法.调用者将在调用时立即返回,方法的实际执行将提交给Spring TaskExecutor的任务中,由指定的线程池中的线程执行. 1. TaskExecutor Spring异步线程池的接口类,其实质是java.util.concurrent

  • 深入理解spring boot异步调用方式@Async

    本文主要给大家介绍了关于spring boot异步调用方式@Async的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍: 1.使用背景 在日常开发的项目中,当访问其他人的接口较慢或者做耗时任务时,不想程序一直卡在耗时任务上,想程序能够并行执行,我们可以使用多线程来并行的处理任务,也可以使用spring提供的异步处理方式@Async. 2.异步处理方式 调用之后,不返回任何数据. 调用之后,返回数据,通过Future来获取返回数据 3.@Async不返回数据 使用@EnableAsyn

  • SpringBoot项目@Async方法问题解决方案

    现象: 1. 表面现象: 方法中输出的日志, 日志文件中找不到, 也没有任何报错(即@Async标注的方法没有执行, 也没有报错) 2. 分析现象: 日志中某个时刻之后没有了task-xxx线程的日志 原因: @Async异常方法默认使用Spring创建ThreadPoolTaskExecutor(参考TaskExecutionAutoConfiguration), 其中默认核心线程数为8, 默认最大队列和默认最大线程数都是Integer.MAX_VALUE. 创建新线程的条件是队列填满时, 而

  • Linux下部署springboot项目的方法步骤

    最近在研究将springboot项目部署到Linux服务器上,由于springboot是内嵌了tomcat,所以可以直接将项目打包上传至服务器上. 1.在pom文件中添加springboot的maven插件 <build> <plugins> <plugin> <groupid>org.springframework.boot</groupid> spring-boot-maven-plugin</artifactid> </p

  • 利用Dockerfile部署SpringBoot项目的方法

    1.创建一个SpringBooot项目并且打成jar包 2.在Linux中创建一个文件夹,来做docker测试 [root@izwz90lvzs7171wgdhul8az ~]# mkdir /root/docker_test 3.将jar包上传到Linux中 创建存放jar包的文件夹 [root@izwz90lvzs7171wgdhul8az docker_test]# mkdir /root/docker_test/jar 然后利用XShell上传jar包到上面的文件夹中 4.编写Docke

  • 如何运行SpringBoot项目的方法

    最近在Ecplise上面写了一个简单的Spring Boot的测试项目,Spring Boot里面是有主函数的: 我们知道的是在Ecplise上面找到这个主函数然后run as->java Application 就可以了 但是总不能一直不脱离Ecplise,总要出来自己单练的 第一步:我就新建的一个文件夹boottest,然后右键导出整个工程: 导出的是jar包,然后我们看网上介绍的SpringBoot启动的方法,就兴致勃勃的去启动SpringBoot 第二步:将导出的jar包解压到我刚才创建

  • Maven搭建springboot项目的方法步骤

    Maven搭建springboot项目 本文是基于Windows 10系统环境,使用Maven搭建springboot项目 Windows 10 apache-maven-3.6.0 IntelliJ IDEA 2018.3.4 x64 一.springboot项目搭建 (1) 新建目录 在某个可用目录下,新建一个文件夹,本文新建目录为 D:\demo\zs200 (2) 创建maven父工程zs200a-parent 填写项目maven坐标 填写项目名称和路径 (2) maven父工程zs20

  • idea新建springboot项目的方法

    不多说废话,直接进入正题,按照下面的步骤创建一个springboot项目一般不会出错,当然不排除可能会有一些脸黑的,不过应该问题不大. 第一步,如果你是在已有的项目里面,新建一个springboot项目 如果你们是在idea打开后没有项目打开创建项目,那就比较简单了,当然你也可以这样回退到选择打开项目的主页面 然后你看到的就是这样子的 点击它,你就进入到创建项目的页面这就正式进入第二步了,你会发现有很多的项目模板,看接下来的操作: 说明一下,那个jdk可以选择自己电脑的,不会安装的网上有很多教程

  • idea中导入别人的springboot项目的方法(图文)

    Springboot导入Idea中项目代码千万不要放在中文路径下,否则会出现一系列问题. 导入项目步骤: 剩下一直点next就可以了.导入完成还需要进行maven配置.需要将别人maven的setting.xml导入.并且修改setting.xml中的maven仓库的地址为自己maven的地址. 到此 maven就配置完成. 到此这篇关于idea中导入别人的springboot项目的方法(图文)的文章就介绍到这了,更多相关idea中导入别人springboot项目内容请搜索我们以前的文章或继续浏

  • Idea如何导入一个SpringBoot项目的方法(图文教程)

    最近公司要求开发工具要用Idea,作为一个eclipse的老员工,记录一下Idea中遇到的坑 刚开始用Idea从Git上导入一个项目时,遇到了很多坑,网上有很多方法,我不多做介绍.只说明一下我使用的方法. 1.本地新建一个文件夹,从git上导入项目到本地文件夹.(git的相关使用请自行百度,这里只讲Idea的使用方法) 2.将这个文件夹直接拖到Idea的启动图标上. 或者,从Idea中File-Open打开你项目的文件夹 3.新导入的SpringBoot项目,需要设置jdk和转maven 设置j

  • 使用jenkins部署springboot项目的方法步骤

    1.准备工作 1.JDK安装 2.Maven安装 3.Git安装 4.jenkins安装 以上软件安装成功后进入jenkins进行相关配置. 如果需要通过SSH进行远程发布项目,jenkins需要安装 Publish Over SSH 插件 2.全局配置 通过whereis git查找git的安装地址 3.全局配置完成后在进行系统配置 ,如图 4.基础配置完成以后,下面我们来新建一个项目 项目的配置: 5.shell mvn clean package -Dmaven.test.skip=tru

  • Gitlab CI-CD自动化部署SpringBoot项目的方法步骤

    目录 一.概述 二.前期准备 三.总体架构图 四.环境搭建 1.环境准备(可选) 2.Gitlab安装 3.安装 Runner 4.安装应用服务器环境 五.创建 SpringBoot 项目 1.使用Gitlab Spring 模板快速创建一个 SpringBoot 项目: 2.添加环境变量(登录应用服务器密码) 六.总结 一.概述 本文主要记录如何通过Gitlab CI/CD自动部署SpringBoot项目jar包. 二.前期准备 准备三台 CentOS7服务器,分别部署以下服务: 序号 系统

随机推荐