当前位置: 代码网 > it编程>编程语言>Java > Spring Boot使用AOP在指定方法执行完后执行异步处理操作

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

2024年07月03日 Java 我要评论
1.在pom.xml中加入如下依赖<dependency> <groupid>org.springframework.boot</groupid> &l

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执行异步处理内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com