010 spring boot@async异步执行方法-尊龙官方平台

010 spring boot@async异步执行方法

el/2024/3/25 17:35:06

spring中用@async注解标记的方法,称为异步方法,它会在调用方的当前线程之外的独立的线程中执行,其实就相当于我们自己new thread(()-> system.out.println("hello world !"))这样在另一个线程中去执行相应的业务逻辑。

@async注解使用条件

  1. @async注解一般用在类的方法上,如果用在类上,那么这个类所有的方法都是异步执行的;
  2. 所使用的@async注解方法的类对象应该是spring容器管理的bean对象;
  3. 调用异步方法类上需要配置上注解@enableasync(不讨好理解,看一下下面的案例就明白了)

 

如果在控制器里启动异步线程,会被视为一起请求,异步线程的启动也被视为一次请求但application为空,因此如果像009文档那样做了aop全局web请求日志记录,那么请在里面添加非空判断,就像下列这样:

/*** 用aop记录web请求日志*/
@aspect
@component
@log4j
public class weblogaspect {/*** 定义切点,切入指定包下的全部类的全部方法*/@pointcut("execution(* com.blacktv.springboot.controller.*.*(*))")public void weblog() {}/*** 前置增强拦截请求参数信息*/@before("weblog()")public void weblogbefore(joinpoint joinpoint) {servletrequestattributes app = (servletrequestattributes) requestcontextholder.getrequestattributes();/*** 如果在控制器里调用了异步线程,这里必须加上非空判断,异步线程的启动也被视为一次请求但application为空,* 如果这里不加一个非空判断,会抛出null异常导致异步线程启动失败。*/if (app == null)return;httpservletrequest request = app.getrequest();//记录url、ip、访问方法log.info("url:"   request.getrequesturi());log.info("ip:"   request.getremoteaddr());log.info("http_method:"   request.getmethod());//记录请求参数enumeration enumeration = request.getparameternames();while (enumeration.hasmoreelements()) {string key = enumeration.nextelement();log.info("key:"   key   " ,value:"   request.getparameter(key));}}/*** 后置增强,记录返回内容** @param result*/@afterreturning(returning = "result", pointcut = "weblog()")public void webloha(object result) {// 后置增强也添加非空判断if (result == null)return;log.info("result:"   result);}
}

异步案例:

/*** 在控制器中启动异步线程,要想调用异步线程类需要在本类标注@enableasync*/
@restcontroller
@enableasync
public class testa {@autowiredprivate testb testb;/*** 用户传入秒数,决定异步线程的休眠时间** @param second* @return*/@getmapping(value = "/test")public string test(int second) throws interruptedexception {if(second <= 0)return "休眠时间不能小于等于0秒";testb.test(second); //启动异步线程 return "异步线程已启动,休眠时间"   second   "s";}
}/*** 异步多线程类,需要用@async标注*/
@async
@service
public class testb {/*** 每隔指定秒数输出一次** @param second 休眠时间,单位秒* @throws interruptedexception*/public void test(int second) throws interruptedexception {while (true) {thread.sleep(second * 1000);//休息second秒system.out.println("testb计时"   second   "秒");}}
}

启动跑一下:


http://www.ngui.cc/el/5127301.html

相关文章

011 spring boot读取application.properties配置文件

可以通过value注解去获application.properties里有配置项的值 value:注入spring boot application.properties配置的属性的值。 注意这个value注解是spring的,不是lombok的,不要用错了。 案例获取emial的值 restcontroller public class t…

012 spring boot区分不同环境配置文件

在开发的时候,配置文件分为开发环境配置、测试环境配置、预生产环境配置、生产环境配置,而配置文件命名方法: application.某某某环境.properties 比如 application-dev.properties然后在application.properties里写入下列配置,代…

014 springboot整合mybatis使用声明式事务

声明式的事务管理是基于aop的,在springboot中可以通过transactional注解的方式获得支持,这种方式的优点是: 1)非侵入式,业务逻辑不受事务管理代码的污染。 2)方法级别的事务回滚,合理划分方法…

015 spring boot配置mybatis多数据源

可能一个项目需要连接多个数据库,就代表有多个数据源,在项目中多数据源通过分包或注解来划分,这里用分包的方式配置。 多数据源理论上是可以引入无数多个的,但是限制于硬件的条件不可能做到引入无限多个数据源。 在编写多数据源的…

002 mysql安装与配置

安装mysql-5.5.40-winx64的过程 进行指定安装目录 后面一直点击下一步直到下图: 下面是选择服务器类型: 第一个是开发者机器,这种类型的库占用资源不多 第二个是服务器机器,这种类型的库占用资源比较多 第三个是专用数据库服务…

003 命令行连接mysql

先来看使用cmd连接mysql,再看使用连接mysql 回车之后需要再次输入密码,如果你要在本机登录root账户直接输入 mysql -u root -p show databases; 按下回车后会让你输入密码 然后按下回车输入(要有分号) show databases; 我们来看看使用mysql 5.5 command …

004 sql——结构化查询语言入门

sql指令是只能被数据库识别的指令,在java中我们要得到mysql数据库中表的一些记录,可以通过在java程序中写sql语句,就可以获取mysql中的数据并返回给java程序。 刚刚说赋值运算符是””,而且比较运算符也是””, decima…

024 union 和 union all 连接查询结果语句

union 操作符用于合并两个或多个 select 语句的结果集。 union 内部的 select 语句必须拥有相同数量的行 语法 select column_name(s) from table_name1 union select column_name(s) from table_name2案例:使用union连接、左连接、右连接语句,实现全…

017 inner join on 多表连接查询语句

inner join on 内连接语句,这个语句用于匹配多个表 inner join 关键字语法 select 要查询的字段 #可以查询表1的也可以查询表n的也可以是通配符 * from table_1 #第一张表 inner join table_2 on table_2.id table_1.id #关联第二张表 inner join table_n on…

020 exists 与 not exists 子查询语句

查询学生表中,成绩大于等于70分的学生,只显示前五名,降序排列 /*查找分数大于等于70的学生成绩只要前五名,降序排列*/ select * from stu inner join fraction on fraction.idstu.id where exists (select id from fraction where…
网站地图