`
forestking
  • 浏览: 43831 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

spring @Async 简单学习

阅读更多

在看spring reference的时候看到spring 中关于异步task的封装,感觉很有意思,试了一下。

简单的说,spring 对java的TaskExecutor进行了封装,可以像pojo一样使用,事实上,我们也可以直接使用TaskExecutorService(如果我没有记错,java里是这个类吧),当然也可以自己实现,但spring提供了一些类,比如ThreadPoolTaskExecutor,为什么不使用呢?当然更重要的是它在配置文件中提供了一种简便方式<task-excutor/>,就相当于声明了一个ThreadPoolTaskExecutor的bean。接下来一步步开始实验。

1, 首先在context.xml中做一些声明,配置ThreadPoolTaskExecutor,以及使用anotation driven

<context:component-scan base-package="test" />
<task:executor id="myExecutor" pool-size="2" />
<task:annotation-driven executor="myExecutor" />

2, 编写需要异步执行的代码。

@Async
	public Future do()  {
		........		
		return new AsyncResult(...);
	}

 这个地方是使我很吃惊的地方。这里只需要做两件事,annotate这个方法为@Async,以及让这个方法返回Future对象(如果这个方法不需要返回值,那这个也不需要,只需要返回void)。而且事实上如果需要传入参数,也可以像其他的方法一样传入。按照文档上说,这样做了以后,当我们调用这个方法以后,会直接返回,但是需要body部分会异步执行,我们所要做的,只需要等在Future.get()上就可以了。神奇吧?

3, 接下来就像其他的bean一样了,caller和callee,通过context得到,就像调用普通方法一样调用就可以了。

4, 一些问题

    当然也遇到了一些问题,不然就像上面简单罗列一下,还不如直接把文档里copy过来。

    a, 一开始,我直接把这个异步方法放在main() (main用来启动context).所在的类里, 结果发现,这个方法事实上没有在异步执行。我搜了一些资料,发现做法和我差不了多少。这种简单的应用spring应该不会有问题吧?我想到spring肯定是要为这个方法生成proxy,它只是替我们做了很多生成thread,future的事情,也许问题出在spring不能为main所在的类生成proxy上面,或者至少是不能为这样的异步方法生成proxy。我把这个方法移到一个新的类中去以后,果然就成功了。当然可能还有更detail的原因。

    b, 按a做了以后很happy。但等程序执行以后,这种happy慢慢地没有了,因为我发现程序过了很久都没有结束。又过了很久还是没有结束(我是用eclipse执行的,从console状态可以看出程序仍然在运行)。我猜这种情况应该是因为那两个异步的任务没有结束掉造成的。我用jconsole查看了一下,果然发现那个异步线程wait中,main线程已经结束了。郁闷。如果是我们自己写的thread,任务完成后自然会停掉,但spring替我们生成的线程还要我们去管理,这个太不爽了。但好在还是有办法处理。就是通过context得到threadPoolTaskExecutor,然后调用destroy方法。

分享到:
评论

相关推荐

    Spring Boot Async异步执行任务过程详解

    Spring Boot Async异步执行任务过程详解主要介绍了Spring Boot中异步执行任务的过程,通过示例代码介绍了非常详细,对大家的学习或者工作具有一定的参考学习价值。 一、异步调用 VS 同步调用 异步调用就是不用等待...

    springboot异步任务案例

    Spring Boot提供了简单易用的API和注解来支持异步任务的实现,特别是通过`@Async`注解和定时任务`@Scheduled`。下面我们将深入探讨这两个核心概念。 ### `@Async` 注解 `@Async`是Spring提供的一个注解,用于标记...

    Spring MVC异步模式

    Spring MVC默认提供了一个简单的`SimpleAsyncTaskExecutor`,但通常我们会选择更高效的实现,如`ThreadPoolTaskExecutor`。 以下是一个简单的`TestController`示例,展示了如何使用`@Async`: ```java import org....

    springboot学习

    Spring Boot 基础教程(基于1.3.x-1.5.x) 快速入门 chapter1:基本项目构建(可作为工程脚手架),引入web模块,完成一个简单的RESTful API 使用Intellij中的Spring Initializr来快速构建Spring Boot/Cloud工程 ...

    spring中邮件及定时任务

    Spring通过JavaMailSender接口提供了一种简单易用的方式来发送邮件。为了使用这个功能,你需要在配置文件中配置JavaMailSender,包括SMTP服务器的地址、端口、用户名和密码。同时,你可以设置邮件的From、To、...

    Spring的多线程应用

    在【描述】中提到的"一个简单的spring的多线程demo",我们可以理解为一个示例项目,旨在帮助开发者理解如何在Spring中实现和管理多线程。 在Java中,多线程主要用于提高应用程序的执行效率,尤其是在处理I/O密集型...

    Spring Boot教程程序样例

    3. **Web开发**:Spring Boot 支持创建RESTful的Web服务,集成Spring MVC框架,使得开发Web应用变得简单。同时,它也提供了对Thymeleaf、FreeMarker、JSP等视图解析器的支持。 4. **数据访问**:Spring Boot 集成了...

    Spring 3.0就这么简单.pdf

    《Spring 3.0就这么简单》是一本深入浅出介绍Spring框架3.0版本的书籍。Spring作为Java领域最流行的轻量级框架之一,它的3.0版本在原有的基础上进行了许多改进和增强,使得开发更加高效,应用更加灵活。本文将详细...

    Spring4JAR包、Spring4API,Spring4源码

    Spring框架是Java开发中广泛应用的一个开源框架,它简化了企业级应用的开发工作。Spring4是Spring框架的一...通过深入学习和理解Spring4的API和源码,开发者能够更好地利用这一强大的框架构建高效、灵活的企业级应用。

    最新版本的spring

    4. **简化AOP**:Spring 3.1.0对AspectJ的集成进行了优化,使切面编程更加简单。@Aspect注解用于定义切面,@Before、@After、@Around等注解用于指定通知。 5. **CGLIB增强**:Spring 3.1.0对CGLIB代理进行了优化,...

    spring2 计划任务

    此外,Spring还提供了`@Async`注解来实现异步任务,与`@Scheduled`不同的是,`@Async`适用于一次性或者无固定时间间隔的任务。结合`@EnableAsync`,可以将方法异步执行,提高系统的并发性能。 在实际开发中,我们...

    spring3.2源码

    6. 对 JMX(Java Management Extensions)的支持:Spring 3.2 提供了更强大的 JMX 集成,使得管理 Spring 应用程序变得更加简单。 二、Eclipse 中导入 Spring 3.2 源码 1. 首先,确保已安装 Eclipse IDE 和 Gradle...

    spring3 mvc jar

    7. ** 支持Maven**:Spring 3提供了更佳的Maven支持,使得依赖管理和构建变得更加简单。 8. ** Portlet MVC**:Spring 3还引入了Portlet MVC,使得开发portlet应用程序变得容易。 9. ** 异步处理**:通过@Async...

    Spring注解.pdf

    从提供的部分内容来看,文档的作者正在着手学习Spring注解,并尝试构建一个简单的Web应用。文档提到了需要使用的jar包,这些jar包分别属于Spring框架的不同模块,如spring-beans、spring-context、spring-web等,...

    spring-framework-3.0源码地址

    7. **Asynchronous Support**:Spring 3.0引入了异步处理支持,通过`@Async`注解,可以轻松地将方法标记为异步执行,提高了应用程序的并发性。 8. **国际化(i18n)**:Spring 3.0提供了一套完整的国际化支持,通过...

    Spring4.0的jar包,官方源码,javadoc

    同时,Spring4.0对异步处理进行了强化,通过AsyncConfigurer接口和@Async注解,使得后台任务的执行变得更加简单,提升了应用的响应速度。 在容器层面,Spring4.0增强了对类型安全的依赖注入(Type-Safe Dependency ...

    spring-framework-4.3.7版本源码

    Spring框架是Java开发中最常用的轻量级开源框架之一,它为构建企业...通过阅读和研究Spring 4.3.7的源码,开发者不仅可以深入理解Spring的工作机制,还能学习到良好的设计模式和最佳实践,从而提高代码质量和可维护性。

    简单的Spring boot demo

    通过这个简单的demo,我们可以学习到Spring Boot的核心概念和常用功能,为后续的Spring Boot项目开发打下基础。在实际应用中,Spring Boot还有更多高级特性,如国际化的支持、邮件服务、任务调度、缓存管理等,可以...

    spring3 enterprise pecipes

    - **RESTful Web Services支持**:Spring 3引入了对构建RESTful Web服务的强大支持,使得创建RESTful API变得更为简单。 - **改进的测试支持**:为了更好地支持单元测试和集成测试,Spring 3提供了更强大的测试工具...

    spring-framework-4.2.1.RELEASE-dist.zip

    4. 异步方法支持:Spring 4.2引入了异步方法执行的支持,通过`@Async`注解,可以在后台线程中执行方法,提高应用的并发性能。 5. Spring Expression Language (SpEL)增强:Spring的表达式语言在4.2版本中进行了优化...

Global site tag (gtag.js) - Google Analytics