在看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中异步执行任务的过程,通过示例代码介绍了非常详细,对大家的学习或者工作具有一定的参考学习价值。 一、异步调用 VS 同步调用 异步调用就是不用等待...
Spring Boot提供了简单易用的API和注解来支持异步任务的实现,特别是通过`@Async`注解和定时任务`@Scheduled`。下面我们将深入探讨这两个核心概念。 ### `@Async` 注解 `@Async`是Spring提供的一个注解,用于标记...
Spring MVC默认提供了一个简单的`SimpleAsyncTaskExecutor`,但通常我们会选择更高效的实现,如`ThreadPoolTaskExecutor`。 以下是一个简单的`TestController`示例,展示了如何使用`@Async`: ```java import org....
Spring Boot 基础教程(基于1.3.x-1.5.x) 快速入门 chapter1:基本项目构建(可作为工程脚手架),引入web模块,完成一个简单的RESTful API 使用Intellij中的Spring Initializr来快速构建Spring Boot/Cloud工程 ...
Spring通过JavaMailSender接口提供了一种简单易用的方式来发送邮件。为了使用这个功能,你需要在配置文件中配置JavaMailSender,包括SMTP服务器的地址、端口、用户名和密码。同时,你可以设置邮件的From、To、...
在【描述】中提到的"一个简单的spring的多线程demo",我们可以理解为一个示例项目,旨在帮助开发者理解如何在Spring中实现和管理多线程。 在Java中,多线程主要用于提高应用程序的执行效率,尤其是在处理I/O密集型...
3. **Web开发**:Spring Boot 支持创建RESTful的Web服务,集成Spring MVC框架,使得开发Web应用变得简单。同时,它也提供了对Thymeleaf、FreeMarker、JSP等视图解析器的支持。 4. **数据访问**:Spring Boot 集成了...
《Spring 3.0就这么简单》是一本深入浅出介绍Spring框架3.0版本的书籍。Spring作为Java领域最流行的轻量级框架之一,它的3.0版本在原有的基础上进行了许多改进和增强,使得开发更加高效,应用更加灵活。本文将详细...
Spring框架是Java开发中广泛应用的一个开源框架,它简化了企业级应用的开发工作。Spring4是Spring框架的一...通过深入学习和理解Spring4的API和源码,开发者能够更好地利用这一强大的框架构建高效、灵活的企业级应用。
4. **简化AOP**:Spring 3.1.0对AspectJ的集成进行了优化,使切面编程更加简单。@Aspect注解用于定义切面,@Before、@After、@Around等注解用于指定通知。 5. **CGLIB增强**:Spring 3.1.0对CGLIB代理进行了优化,...
此外,Spring还提供了`@Async`注解来实现异步任务,与`@Scheduled`不同的是,`@Async`适用于一次性或者无固定时间间隔的任务。结合`@EnableAsync`,可以将方法异步执行,提高系统的并发性能。 在实际开发中,我们...
6. 对 JMX(Java Management Extensions)的支持:Spring 3.2 提供了更强大的 JMX 集成,使得管理 Spring 应用程序变得更加简单。 二、Eclipse 中导入 Spring 3.2 源码 1. 首先,确保已安装 Eclipse IDE 和 Gradle...
7. ** 支持Maven**:Spring 3提供了更佳的Maven支持,使得依赖管理和构建变得更加简单。 8. ** Portlet MVC**:Spring 3还引入了Portlet MVC,使得开发portlet应用程序变得容易。 9. ** 异步处理**:通过@Async...
从提供的部分内容来看,文档的作者正在着手学习Spring注解,并尝试构建一个简单的Web应用。文档提到了需要使用的jar包,这些jar包分别属于Spring框架的不同模块,如spring-beans、spring-context、spring-web等,...
7. **Asynchronous Support**:Spring 3.0引入了异步处理支持,通过`@Async`注解,可以轻松地将方法标记为异步执行,提高了应用程序的并发性。 8. **国际化(i18n)**:Spring 3.0提供了一套完整的国际化支持,通过...
同时,Spring4.0对异步处理进行了强化,通过AsyncConfigurer接口和@Async注解,使得后台任务的执行变得更加简单,提升了应用的响应速度。 在容器层面,Spring4.0增强了对类型安全的依赖注入(Type-Safe Dependency ...
Spring框架是Java开发中最常用的轻量级开源框架之一,它为构建企业...通过阅读和研究Spring 4.3.7的源码,开发者不仅可以深入理解Spring的工作机制,还能学习到良好的设计模式和最佳实践,从而提高代码质量和可维护性。
通过这个简单的demo,我们可以学习到Spring Boot的核心概念和常用功能,为后续的Spring Boot项目开发打下基础。在实际应用中,Spring Boot还有更多高级特性,如国际化的支持、邮件服务、任务调度、缓存管理等,可以...
- **RESTful Web Services支持**:Spring 3引入了对构建RESTful Web服务的强大支持,使得创建RESTful API变得更为简单。 - **改进的测试支持**:为了更好地支持单元测试和集成测试,Spring 3提供了更强大的测试工具...
4. 异步方法支持:Spring 4.2引入了异步方法执行的支持,通过`@Async`注解,可以在后台线程中执行方法,提高应用的并发性能。 5. Spring Expression Language (SpEL)增强:Spring的表达式语言在4.2版本中进行了优化...