Spring异步执行(@Async)2点注意事项

Spring中可以异步执行代码,注解方式是使用@Async注解。

原理、怎么使用,就不说了。

写2点自己遇到过的问题。

1.方法是公有的

// 通知归属人
@Async
public void notifyPusher(Project project) {

2.异步代码,需要放在外部单独的类中。

@Service("asyncBiz")
public class AsyncBiz {

@Async
public void notifyPusher(Project project) {

据说这是一个“常识”,外部方法才会被Spring拦截器拦截到额。

代码调用示例

@Service
public class ProjectServiceImpl implements ProjectService{

public void audit(long id, short status) {

			if(project.getPusher() != null){
				AsyncBiz asyncBiz = SpringContextUtil.asyncBiz();
				asyncBiz.notifyPusher(project);
				asyncBiz.notifyCare(project);
			}

	}

}

一个工具类

@Component
public class SpringContextUtil implements ApplicationContextAware{

	private static ApplicationContext ctx;
	@Override
	public void setApplicationContext(ApplicationContext applicationContext)
			throws BeansException {
		this.ctx = applicationContext;
	}

	public static ApplicationContext getCtx(){
		return ctx;
	}

	public static Object getBean(String name) throws BeansException {
        return ctx.getBean(name);
	} 

	public static AsyncBiz asyncBiz() throws BeansException {
        return (AsyncBiz) ctx.getBean("asyncBiz");
	} 

}

可以灵活手动获得Spring容器中的bean,也可以很好地解决循环依赖问题。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-11 09:34:37

Spring异步执行(@Async)2点注意事项的相关文章

spring异步执行报异常No qualifying bean of type 'org.springframework.core.task.TaskExecutor' available

最近观察项目运行日志的时候突然发现了一个异常, [2018-04-03 10:49:07] 100.0.1.246 http-nio-8080-exec-9 DEBUG org.springframework.scheduling.annotation.AnnotationAsyncExecutionInterceptor---- Could not find default TaskExecutor bean org.springframework.beans.factory.NoSuchBe

关于异步执行(Async/await)的理解(转发)

原文地址: http://blog.jobbole.com/85787/ 同步编程与异步编程 通常情况下,我们写的C#代码就是同步的,运行在同一个线程中,从程序的第一行代码到最后一句代码顺序执行.而异步编程的核心是使用多线程,通过让不同的线程执行不同的任务,实现不同代码的并行运行. 前台线程与后台线程 关于多线程,早在.NET2.0时代,基础类库中就提供了Thread实现.默认情况下,实例化一个Thread创建的是前台线程,只要有前台线程在运行,应用程序的进程就一直处于运行状态,以控制台应用程序

工作随笔——spring异步处理@Async使用笔记

@Async使用笔记 必须是public方法 必须是非static方法 方法调用的实例必须由spring创建和管理 代码示例如下: // 创建Foo类@Component class Foo { @Async public static void bar(){ /* ... */ } @Async public void bar2(){ /* ... */ } } // 调用示例代码class Test { @Autowired //@Lazy(true)可以解决spring循环引用的问题 Fo

使用spring的@Async异步执行方法

应用场景: 1.某些耗时较长的而用户不需要等待该方法的处理结果 2.某些耗时较长的方法,后面的程序不需要用到这个方法的处理结果时 在spring的配置文件中加入对异步执行的支持 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.spri

Spring Boot Async异步执行

异步调用就是不用等待结果的返回就执行后面的逻辑,同步调用则需要等带结果再执行后面的逻辑. 通常我们使用异步操作都会去创建一个线程执行一段逻辑,然后把这个线程丢到线程池中去执行,代码如下: ExecutorService executorService = Executors.newFixedThreadPool(10); executorService.execute(() -> { try { // 业务逻辑 } catch (Exception e) { e.printStackTrace(

Spring开启方法异步执行

@EnableAsync @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Import(AsyncConfigurationSelector.class) public @interface EnableAsync { Class<? extends Annotation> annotation() default Annotation.class; boolean proxyTargetCl

利用Spring MVC中@Async异步特性改善耗时操作的用户体验

Web应用中,有时会遇到一些耗时很长的操作(比如:在后台生成100张报表再呈现,或 从ftp下载若干文件,综合处理后再返回给页面下载),用户在网页上点完按钮后,通常会遇到二个问题:页面超时.看不到处理进度. 对于超时,采用异步操作,可以很好的解决这个问题,后台服务收到请求后,执行异步方法不会阻塞线程,因此就不存在超时问题.但是异步处理的进度用户也需要知道,否则不知道后台服务何时完成,不知道是否继续等候,还是关掉页面. 思路: 1.browser -> Spring-MVC Controller

SpringBoot系列:Spring Boot异步调用@Async

在实际开发中,有时候为了及时处理请求和进行响应,我们可能会多任务同时执行,或者先处理主任务,也就是异步调用,异步调用的实现有很多,例如多线程.定时任务.消息队列等, 这一章节,我们就来讲讲@Async异步方法调用. 一.@Async使用演示 @Async是Spring内置注解,用来处理异步任务,在SpringBoot中同样适用,且在SpringBoot项目中,除了boot本身的starter外,不需要额外引入依赖. 而要使用@Async,需要在启动类上加上@EnableAsync主动声明来开启异

node js 异步执行流程控制模块Async介绍

1.Async介绍 sync是一个流程控制工具包,提供了直接而强大的异步功能.基于Javascript为Node.js设计,同时也可以直接在浏览器中使用. Async提供了大约20个函数,包括常用的 map, reduce, filter, forEach 等,异步流程控制模式包括,串行(series),并行(parallel),瀑布(waterfall)等. 项目地址:https://github.com/caolan/async 2. Async安装 npm install async 3.