Spring3.x中的几个异步执行
程序员文章站
2022-05-25 08:08:44
...
1.servlet3
细节可以阅读http://www.ibm.com/developerworks/cn/java/j-lo-servlet30/
现在通过使用 Servlet 3.0 的异步处理支持,之前的 Servlet 处理流程可以调整为如下的过程:首先,Servlet 接收到请求之后,可能首先需要对请求携带的数据进行一些预处理;接着,Servlet 线程将请求转交给一个异步线程来执行业务处理,线程本身返回至容器,此时 Servlet 还没有生成响应数据,异步线程处理完业务以后,可以直接生成响应数据(异步线程拥有 ServletRequest 和 ServletResponse 对象的引用),或者将请求继续转发给其它 Servlet。如此一来, Servlet 线程不再是一直处于阻塞状态以等待业务逻辑的处理,而是启动异步线程之后可以立即返回。
总结起来,就是1.Servlet线程调用到另外的线程去执行方法,而自身线程将立即释放;节约了宝贵的tomcat并发连接数,也就是同时可以容纳更多的并发。 2.response还是需要等待新线程执行完方法返回的,也就是这个做法,并不会节约客户端的请求回应等待时间。
2.TaskExecutor
private TaskExecutor taskExecutor;
public TaskExecutorExample(TaskExecutor taskExecutor) {
this.taskExecutor = taskExecutor;
}
这个东西是异步的么?也不一定。线程池提交,解决的是多个人一起去干活,但是单个活的耗时是无法节约的。看doc文档这么写
void org.springframework.core.task.TaskExecutor.execute(Runnable task)
Execute the given task.
The call might return immediately if the implementation uses an asynchronous execution strategy, or might block in the case of synchronous execution.
[email protected]
真正的异步调用,调用方不等待函数的返回,最适用于需要立即返回的地方了。
http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/scheduling.html#scheduling-annotation-support-async
The @Async annotation can be provided on a method so that invocation of that method will occur asynchronously. In other words, the caller will return immediately upon invocation and the actual execution of the method will occur in a task that has been submitted to a Spring TaskExecutor. In the simplest case, the annotation may be applied to a void-returning method.
@Async
void doSomething() {
// this will be executed asynchronously
}
需要返回的时候,必须单独处理
@Async
Future<String> returnSomething(int i) {
// this will be executed asynchronously
}
默认用于方法上,但是一样可以作用于spring的executor bean。Executor qualification with @Async
@Async("otherExecutor")
void doSomething(String s) {
// this will be executed asynchronously by "otherExecutor"
}
推荐阅读
-
javascript - 用户发帖应用开发中,用户异步上传了图片,但最终帖子没发布,那么上传的图不就没有用了吗怎么处理这种情况?
-
JS中怎样操作代码执行的先后顺序
-
SQLServer中SELECT语句的执行顺序
-
PHP中执行cmd命令的方法_PHP
-
请教高手php中的EXEC可以执行远程服务器的脚本吗
-
Oracle执行计划中的连接方式nested loops join、sort merge joinn、hash join
-
基于PHP异步执行的常用方式详解_php实例
-
php中实现用数组妩媚地生成要执行的sql语句_php实例
-
jquery ajax 同步异步的执行示例代码_jquery
-
在psql中,使用\watch反复查看语句的执行结果