使用@Async注解处理异步调用

在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的;但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在spring 3.x之后,就已经内置了@Async来完美解决这个问题。

1.@Async介绍

    在Spring中,基于@Async标注的方法,称之为异步方法;这些方法将在执行的时候,将会在独立的线程中被执行,调用者无需等待它的完成,即可继续其他的操作。

   如何在Spring Boot中启用@Async。基于Java配置的启用方式:

   

 @SpringBootApplication 
 @EnableAsync  
 public class Application{ 
	 public static ConfigurableApplicationContext applicationContext;
	 public static void main(String[] args) {
	        applicationContext = SpringApplication.run(Application.class, args);
	 }
 }

2. 基于@Async无返回值调用

    使用的方式非常简单,一个标注即可解决所有的问题:

@Async  //标注使用  
public void asyncMethodWithVoidReturnType() {  
     System.out.println("Execute method asynchronously. "  
       + Thread.currentThread().getName());  
} 

3. 基于@Async返回值的调用

    返回的数据类型为Future类型,其为一个接口。具体的结果类型为AsyncResult,这个是需要注意的地方。

@Async  
public Future asyncMethodWithReturnType() {  
    System.out.println("Execute method asynchronously - "  + Thread.currentThread().getName());  
    try {  
        Thread.sleep(5000);  
        return new AsyncResult("hello world !!!!");  
    } catch (InterruptedException e) {  
        //  
    }  
   
    return null;  
}

    调用返回结果的异步方法示例

public void testAsyncAnnotationForMethodsWithReturnType()  
   throws InterruptedException, ExecutionException {  
    System.out.println("Invoking an asynchronous method. "   + Thread.currentThread().getName());  
    Future future = asyncAnnotationExample.asyncMethodWithReturnType();  
   
    while (true) {  ///这里使用了循环判断,等待获取结果信息  
        if (future.isDone()) {  //注意这里需要判断是否执行完毕, 否则future.get()获取结果可能会抛出空指针异常
            System.out.println("Result from asynchronous process - " + future.get());  
            break;  
        }  
        System.out.println("Continue doing something else. ");  
        Thread.sleep(1000);  
    }  
}

   这些获取异步方法的结果信息,是通过不停的检查Future的状态来获取当前的异步方法是否执行完毕来实现的。

4.@Transaction,@Async在同一个类中注解失效的原因,参考https://blog.csdn.net/qq602757739/article/details/81327990

   伪代码示例:

    @Async
    @Transactional(propagation = Propagation.REQUIRED, isolation =             Isolation.REPEATABLE_READ, timeout = 36000, rollbackFor = Exception.class)
    public Future closeOrderAsync(long mId, BigInteger oId) {
    	a();
    	b();
    }

    private void a() {
    	//do insert
    }

    private void b() {
    	//do update
    }

 

 

你可能感兴趣的:(JAVA并发编程)