`

spring 3中的@async初探

阅读更多
  在spring 3中,@Async注解能让某个方法快速变为异步执行,马上来先DEMO上手下。

假如在网站的用户注册后,需要发送邮件,然后用户得到邮件确认后才能继续其他工作;
假设发送是一个很耗费时间的过程,因此需要异步。

1 namespace要注意,加上task
  

<?xml version=”1.0″ encoding=”UTF-8″?>

<beans xmlns=”http://www.springframework.org/schema/beans” xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
xmlns:p=”http://www.springframework.org/schema/p” xmlns:context=”http://www.springframework.org/schema/context”
xsi:schemaLocation=”
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd”>

<context:component-scan base-package=”cs”/>

</beans>


2 RegularService.java 注册类
  
 import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import cs.async.MailUtility;

@Service
public class RegularService {

@Autowired
private MailUtility mailUtility ;

public void registerUser(String userName){

System.out.println(” User registration for  “+userName +” complete”);

mailUtility.sendMail(userName);

System.out.println(” 注册完成,邮件稍后发送“);
}

}

3 发送邮件的工具类
   
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

@Component
public class MailUtility {

@Async
public void sendMail(String name){

System.out.println(” 在做发送准备工作中  “);

try {
Thread.sleep(5000);

} catch (InterruptedException e) {

e.printStackTrace();
}

System.out.println(” 异步发送完毕“);

}

}


4 最后在applicationContext.xml中加入:
 
<?xml version=”1.0″ encoding=”UTF-8″?>

<beans xmlns=”http://www.springframework.org/schema/beans” xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
xmlns:p=”http://www.springframework.org/schema/p” xmlns:context=”http://www.springframework.org/schema/context”
xmlns:task=”http://www.springframework.org/schema/task”
xsi:schemaLocation=”
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd“>

<context:component-scan base-package=”cs”/>

<task:annotation-driven/>

</beans>

   就是<task:annotation-driven/>这个一定不能少喔。

5 运行:
   User registration for  tom complete
  注册完成,邮件稍后发送
在做发送准备工作中
异步发送完毕

6 有的时候,要从异步中返回值,这个时候,spring会返回一个java.util.concurrent.Future对象,要调用其中的get方法,比如
  
@Async
public Future<Balance> findBalanceAsync(final Account account) {
    Balance balance = accountRepository.findBalance(account);
    return new AsyncResult<Balance>(balance);
}

Balance balance = future.get();


  

3
2
分享到:
评论
9 楼 jackyrong 2013-04-30  
huang_yong 写道
请教一个问题:

若@Async定义在@Service类的方法上,则无法实现异步效果?例如:

@Service
public class MailServiceImpl implements MailService {
    [color=red]@Async[/color]
    @Override
    public void sendMail(...) {
        ...
    }
}


以上无法实现异步调用。若在该类中封装一个private方法,则仍然无法实现。

若单独定义一个@Component类,在该类的方法上使用@Async,则可以实现异步效果。例如:

@Component
public class MailSender {
    [color=red]@Async[/color]
    public void send(...) {
        ...
    }
}


在MailServiceImpl注入MailSender,并调用send方法,这样可以实现异步调用。


应该是的
8 楼 huang_yong 2013-04-29  
请教一个问题:

若@Async定义在@Service类的方法上,则无法实现异步效果?例如:

@Service
public class MailServiceImpl implements MailService {
    [color=red]@Async[/color]
    @Override
    public void sendMail(...) {
        ...
    }
}


以上无法实现异步调用。若在该类中封装一个private方法,则仍然无法实现。

若单独定义一个@Component类,在该类的方法上使用@Async,则可以实现异步效果。例如:

@Component
public class MailSender {
    [color=red]@Async[/color]
    public void send(...) {
        ...
    }
}


在MailServiceImpl注入MailSender,并调用send方法,这样可以实现异步调用。
7 楼 宋建勇 2012-11-21  
jd2bs 写道
Future.get() 貌似阻塞的,最好写成

if(Future..isDone()){
   Future.get();
}


http://www.cnblogs.com/uptownBoy/articles/1772483.html   

nice
6 楼 freezingsky 2012-11-19  
kjj 写道
宋建勇 写道
不过,从异步中返回值的话就没有达到异步的效果

返回值为啥就没有异步效果!!

我只能说1楼想多了!
5 楼 jackyrong 2012-11-17  
jd2bs 写道
Future.get() 貌似阻塞的,最好写成

if(Future..isDone()){
   Future.get();
}


http://www.cnblogs.com/uptownBoy/articles/1772483.html   


GOOD
4 楼 jd2bs 2012-11-17  
Future.get() 貌似阻塞的,最好写成

if(Future..isDone()){
   Future.get();
}


http://www.cnblogs.com/uptownBoy/articles/1772483.html   
3 楼 kjj 2012-11-17  
宋建勇 写道
不过,从异步中返回值的话就没有达到异步的效果

返回值为啥就没有异步效果!!
2 楼 宋建勇 2012-11-17  
不过,从异步中返回值的话就没有达到异步的效果
1 楼 宋建勇 2012-11-17  

相关推荐

    JAVA 中Spring的@Async用法总结

    之前大部分都是使用多线程来完成此类任务,但是在 Spring 3.x 之后,就已经内置了 @Async 来完美解决这个问题。 异步调用 异步调用是指在发送调用指令后,不等待被调用方法完全执行完毕,而是继续执行下面的流程。...

    Spring Boot利用@Async如何实现异步调用:自定义线程池

    在Spring Boot中,可以使用@Async注解来实现异步调用。 使用@Async实现异步调用 在Spring Boot中,使用@Async注解可以将方法异步执行。@Async注解可以应用于方法上,使得该方法可以异步执行。例如: ```java @...

    Spring中@Async注解执行异步任务的方法

    Spring中@Async注解执行异步任务的方法 在业务处理中,有些业务使用异步的方式更为合理。这篇文章主要介绍了Spring中@Async注解执行异步任务的方法。@Async注解是Spring提供的一个annotation,可以将方法异步化,...

    关于Spring中@Async注解使用

    Spring 中 @Async 注解的使用 @Async 注解是 Spring 框架提供的一种异步执行方法的实现方式,从 Spring 3.0 版本开始提供。使用 @Async 注解可以将方法标识为异步方法,通过 SimpleAsyncTaskExecutor 执行,但不...

    Spring @async方法如何添加注解实现异步调用

    当我们在 Spring 中使用 @Async 注解时,Spring 会扫描方法上是否包含 @Async 注解,如果包含的,Spring 会为该 Bean 动态生成一个代理类,代理类是继承我们所写的 Bean 的,然后把代理类注入进来,那此时,在执行此...

    关于Spring注解@Async引发其他注解失效的解决

    Spring @Async 注解引发其他注解失效的解决 Spring 框架提供了多种注解来帮助开发者简化代码,例如 @Async 用于异步执行方法、@Transaction 用于事务管理等。但是,在使用这些注解时,可能会遇到一些问题,例如 @...

    Spring Boot利用@Async异步调用:使用Future及定义超时详解

    在Spring Boot应用中,我们可以利用`@Async`注解实现异步调用,这有助于提高应用程序的并发性能,尤其在处理耗时操作时。本文将详细介绍如何使用`@Async`结合`Future`来处理异步任务,并探讨如何定义超时。 `@Async...

    【java框架】SpringBoot(10) -- SpringBoot巧用 @Async提升API接口并发能力 .pdf

    在Spring Boot中,我们可以使用`@Async`注解将同步方法转换为异步方法。 2. **SpringBoot中的@Async** 要使用`@Async`,首先需要配置一个`TaskExecutor`。Spring Boot默认提供了一个简单的线程池配置,如果需要...

    Spring中@Async注解实现异步调详解

    Spring中@Async注解实现异步调用详解 在Spring框架中,@Async注解是实现异步调用的一个重要机制。异步调用是指在程序执行过程中,不需要等待某个方法的执行结果,而是继续执行下一个方法。这种机制可以极大地提高...

    Spring中@Async用法详解及简单实例

    【Spring中@Async用法详解及简单实例】 在Spring框架中,@Async注解用于实现异步方法调用,这是Spring 3.x引入的一个特性,旨在简化多线程编程,提高应用程序的性能和响应速度。在传统的同步调用中,程序会按照顺序...

    springboot中@Async默认线程池导致OOM问题

    SpringBoot 中 @Async 默认线程池导致 OOM 问题 在 SpringBoot 中使用 @Async 注解来实现异步操作是一种非常常见的做法,但是如果不小心,可能会导致 OOM(Out of Memory)问题。本文将详细介绍 SpringBoot 中 @...

    Spring boot注解@Async线程池实例详解

    Spring Boot 提供了 @Async 注解,可以将方法异步化,使得方法的调用者不需要等待方法的执行结果,直接返回,而方法的实际执行将提交给 Spring 的 TaskExecutor 中,由指定的线程池中的线程执行。 2. TaskExecutor...

    springboot中@Async异步调用注解的使用

    在Spring Boot框架中,@Async注解是实现异步任务处理的关键工具,它允许开发者将耗时的操作从主线程中分离出来,以提高应用程序的响应速度。本文将深入探讨@Async的工作原理、配置方法以及使用场景,帮助你更好地...

    Spring中异步注解@Async的使用、原理及使用时可能导致的问题及解决方法

    Spring 中异步注解 @Async 的使用、原理及使用时可能导致的问题及解决方法 @Async 注解是一种非常有用的spring 注解,它可以让被标注的方法异步执行,从而提高应用程序的性能和响应速度。但是,@Async 注解的使用也...

    spring boot 使用@Async实现异步调用方法

    下面将详细解释如何在Spring Boot中使用`@Async`实现异步调用,以及其背后的原理。 首先,要启用`@Async`注解的功能,需要在Spring Boot的主配置类上添加`@EnableAsync`注解。这会告诉Spring框架,你需要异步任务的...

    浅谈Spring @Async异步线程池用法总结

    3. Spring开启异步配置 Spring提供了两种方法来开启异步配置:注解和XML。可以使用@EnableAsync注解来开启异步调用功能,並且可以自定义自己的线程池。 @EnableAsync注解需要配合public AsyncTaskExecutor ...

    深入理解Spring注解@Async解决异步调用问题

    要在Spring中启用@Async,需要在配置文件中添加@EnableAsync注解。然后,在方法上添加@Async注解,声明该方法为异步调用方法。这样,在执行该方法时,将会在独立的线程中被执行,调用者无需等待它的完成。 四、使用...

    谈谈SpringBoot中@Async注解使用的一些误区

    在Spring Boot应用中,`@Async`注解是Spring框架提供的异步处理功能,它使得开发者可以方便地实现非阻塞式编程,提高应用程序的执行效率。然而,很多初学者在使用`@Async`时可能会遇到一些误区,导致程序运行结果不...

    带有@Transactional和@Async的循环依赖问题

    在Spring框架中,`@Transactional` 和 `@Async` 是两个非常重要的注解,它们分别用于声明事务管理和异步执行。然而,当这两个注解同时出现在一个方法上时,可能会引发一些复杂的问题,特别是在存在循环依赖的情况下...

Global site tag (gtag.js) - Google Analytics