欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

SpringBoot使用AOP在指定方法执行完后执行异步处理操作,

来源: javaer 分享于  点击 9175 次 点评:152

SpringBoot使用AOP在指定方法执行完后执行异步处理操作,


目录
  • 1.在pom.xml中加入如下依赖
  • 2.在Spring Boot的application启动类上加上
  • 3.创建异步执行类MyAsyncTask
  • 4.创建Aspect类,定义切入点并在切入点执行后调用异类执行类的异步方法
  • 5.注意事项:

1.在pom.xml中加入如下依赖

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

2.在Spring Boot的application启动类上加上

      @EnableAsync(proxyTargetClass = true)
       proxyTargetClass为可选配置相,默认为false

3.创建异步执行类MyAsyncTask

@Component
public class MyAsyncTask {
    private Logger logger = LoggerFactory.getLogger(getClass());
    @Async
    public void refreshMyDbAsync(String url, String id) {
    	for(int i=0; i < 10; i++){
    	    logger.info("2.In Async Method id:" + id + " count:" + i + " URL:" + url);
    	    try {
		    Thread.sleep(5000);
	    } catch (InterruptedException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	    }
    	}
    }
}

4.创建Aspect类,定义切入点并在切入点执行后调用异类执行类的异步方法

@Aspect
@Component
public class MyAspect {
    private Logger logger = LoggerFactory.getLogger(getClass());
    @Autowired
    private MyAsyncTask myAsyncTask;
    @Pointcut("execution(* com.lantian.controller.Controller1.detail(..)) || "
            + "execution(* com.lantian.controller.Controller1.list(..)) || "
            + "execution(* com.lantian.controller.Controller2.detail(..))")
    public void modifyMethod() {}
    @AfterReturning(returning = "ret", pointcut = "modifyMethod()")
    public void afterModify(Object ret) {
    	//获取request
    	HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
    	String url = request.getRequestURL().toString();
    	String id = request.getParameter("id");
    	logger.info("1.Before Async Method URL:"+url);
    	logger.info(ret+"");
    	myAsyncTask.refreshMyDbAsync(url, id);
    	logger.info("3.After Async Method URL:"+url);
    }
}

5.注意事项:

   异步方法不能直接写在Aspect类里,否则不会异步执行。
      spring对@Transactional注解时也有类似问题,spring扫描时具有@Transactional注解方法的类时,是生成一个代理类,由代理类去开启关闭事务,而在同一个类中,方法调用是在类体内执行的,spring无法截获这个方法调用。

到此这篇关于Spring Boot使用AOP在指定方法执行完后执行异步处理的文章就介绍到这了,更多相关Spring Boot AOP执行异步处理内容请搜索3672js教程以前的文章或继续浏览下面的相关文章希望大家以后多多支持3672js教程!

您可能感兴趣的文章:
  • SpringBoot线程池ThreadPoolTaskExecutor异步处理百万级数据
  • springboot异步处理@NotBlank或@NotNull注释校验不生效问题
  • Springboot 异步任务和定时任务的异步处理
  • SpringBoot异步处理的四种实现方式
  • Springboot集成定时器和多线程异步处理操作
  • Springboot实现高吞吐量异步处理详解(适用于高并发场景)
  • SpringBoot高并发下控制限流的几种实现方法
  • SpringBoot 并发登录人数控制的实现方法
  • 如何在Spring Boot中实现异步处理与并发控制
相关栏目:

用户点评