spring的@Async 注解实现方法的异步调用

一、介绍

spring为任务调度与异步方法的执行提供了注解支持。
通过在方法上设置@Async注解,可以实现方法的异步调用。简单说,就是调用者在调用后会立刻得到返回,但实际的方法并未完全执行,而是交给了spring的TaskExecutor来执行。

二、开启对@Async注解支持

<!-- 启动对@Async注解,异步方法执行的支持 -->  
<task:annotation-driven executor="asyncExecutor" />
<task:executor id="asyncExecutor" pool-size="100-10000" queue-capacity="10"/>

三、举个栗子

首先,同步调用的栗子:
@Component
public class TestAsyncBean {
    @Async
    public String sayHello2() throws InterruptedException {
        Thread.sleep(2 * 1000);//模拟网络请求,发送消息等消耗的时间
        System.out.println("你好,小黑");
    }
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:/applicationContext.xml"})
public class TestAsync {
    @Autowired
    private TestAsyncBean testAsyncBean;
    @Test
    public void test_sayHello2() throws InterruptedException, ExecutionException {
        System.out.println("小白,你好");
        System.out.println(testAsyncBean.sayHello2());
        System.out.println("你叫我啥?");
        Thread.sleep(3 * 1000);// 不让主进程过早结束,保证异步方法的正确执行
    }
}

同步调用结果:

小白,你好
小黑,你好
你叫我啥?
使用@Async的异步调用:
@Component
public class TestAsyncBean {
    @Async
    public void sayHello3() throws InterruptedException {
        Thread.sleep(2 * 1000);//网络连接中 。。。消息发送中。。。
        System.out.println("小黑,你好");
    }
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:/applicationContext.xml"})
public class TestAsync {
    @Autowired
    private TestAsyncBean testAsyncBean;
    @Test
    public void test_sayHello3() throws InterruptedException, ExecutionException {
        System.out.println("小白,你好");
        testAsyncBean.sayHello3();
        System.out.println("你叫我啥?");
        Thread.sleep(3 * 1000);// 不让主进程过早结束
    }
}

异步调用结果:

小白,你好
你叫我啥?
小黑,你好

四、结论

通过上面的栗子,可以看出,异步调用,是把异步方法执行的任务,交给spring的TaskExecutor来执行,调用者会立即得到调用返回,而不需要等到调用方法完全执行完,才获得放回值。
举个实际应用中的栗子,
比如在项目中做一个开放接口,这个开放接口是让其他人员来请求调用的,而该接口内部逻辑复杂,程序执行时间长,而调用者并不关心最终执行结果,只需要知道是否确切的调用成功了,那么就可以使用异步调用来避免接口长时间的请求等待了,也避免了请求断开造成的一系列风险操作。

猜你喜欢

转载自blog.csdn.net/u010398838/article/details/79928139