JavaEE Async 异步支持
2018-03-26 15:34
309 查看
前言
Async技术是Servlet3.0 之后添加的,用于处理异步请求。在此之前,大多为同步请求,客户端向服务器提交请求,假设请求很耗时,那么按照之前同步的处理办法,servlet在接收到这个请求之后,会调用去处理这个耗时操作,如果这个耗时操作长时间没有返回,那么就造成了服务器的阻塞,服务器资源得不到有效利用,这样的结果显然对于服务器的高并发是非常不利的。服务器可以异步执行,在等待长时间的过程完成期间,控制容器执行其他任务,当耗时操作完成返回后,再调用资源处理这个返回请求。
使用Async的步骤
启用async
异步行为需要在Servlet中显式启用 ,其方法有两种:添加@WebServlet的asyncSupported属性实现
@WebServlet(urlPatterns = "/async", asyncSupported = true)
在web.xml文件中实现
<servlet> <servlet-name>AsyncServlet</servlet-name> <servlet-class>com.dimple.servlet.AsyncServlet</servlet-class> <async-supported>true</async-supported> <!--设置启用Async--> </servlet>
在Servlet中开启async
@WebServlet(name = "AsyncServlet", urlPatterns = "/async",asyncSupported = true) public class AsyncServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); //输出Servlet开始的时候的系统时间 out.println("Servlet is starting:"+new Date()); //创建AsyncContext,开始异步调用 AsyncContext asyncContext=request.startAsync(); //设置超时时长,单位为毫秒 asyncContext.setTimeout(60*1000); //启动异步调用的线程 asyncContext.start(new MyTask(asyncContext)); //输出Servlet结束的时间 out.println("Servlet is ending :"+new Date()); } }
MyTask内容:
public class MyTask implements Runnable { AsyncContext context; public MyTask(AsyncContext context) { this.context = context; } /** * 此处单开一个线程进行耗时操作,为了模拟耗时操作,这里先让线程Sleep5秒。 */ @Override public void run() { try { Thread.sleep(5*1000); context.getResponse().getWriter().print("async is ending : "+new Date()); } catch (InterruptedException | IOException e) { e.printStackTrace(); } } }
执行结果如下:
注意:这是采用IDEA开发的,可能采用Eclipse的小伙伴的开发的和我这边的url不一样。
AsyncListener 异步监听器
为了更加清晰的看到异步操作的各种细节,可以借助异步监听器实现。异步监听器需要实现AsyncListener接口,该接口需要实现如下方法:
@Override public void onComplete(AsyncEvent asyncEvent) throws IOException { //当异步调用完成后被调用 } @Override public void onTimeout(AsyncEvent asyncEvent) throws IOException { //超时被调用 } @Override public void onError(AsyncEvent asyncEvent) throws IOException { //出现错误的时候被调用 } @Override public void onStartAsync(AsyncEvent asyncEvent) throws IOException { //启动Async的时候被调用 }
添加监听
4000
器的方法:
asyncContext.addListener(new MyAsyncListener);
总结
使用Servlet3.0的Async异步支持,步骤总结如下:首先先声明异步支持(web.xml或者注解@webServlet)
在相应的Servlet中获取AsyncContext实例。一般采用
request.startAsync();该方法发挥一个AsyncContext对象。
设置超时
context.setTimeout();
启动线程
context.start(Runable runable);
在相应的实现Runable接口的方法里进行耗时操作。
相关文章推荐
- Spring开启@Async异步方法(javaconfig配置)
- 学习Servlet中的异步处理 —— Servlet3.0中的Async支持
- WPF-支持异步操作的ObservableCollection-AsyncObservableCollection
- WPF-支持异步操作的ObservableCollection-AsyncObservableCollection
- AsyncHttpClient异步请求工具箱/简单使用(异步的同步支持)
- @Async java 异步方法
- Java什么时候提高境界支持async/await写法啊?
- JAVA Web Servlet中的异步处理 (1) -- Servlet3.0中的Async支持
- javascript 支持链式调用的异步调用框架Async.Operation
- Java利用httpasyncclient进行异步HTTP请求
- jQuery 异步上传插件 Uploadify302 使用 (JavaEE Spring MVC)
- Spring开启@Async异步方法(javaconfig配置)
- jQuery 异步上传插件 Uploadify302 使用 (JavaEE Spring MVC)
- java并发编程--Executor框架(一) 摘要: Eexecutor作为灵活且强大的异步执行框架,其支持多种不同类型的任务执行策略,提供了一种标准的方法将任务的提交过程和执行过程
- Java利用httpasyncclient进行异步HTTP请求
- 解决Tomcat 6.0 只支持 J2EE 1.2, 1.3, 1.4, and Java EE 5 Web modules
- Java for Web学习笔记(六八):Service和Repository(3)异步Async和调度Schedule
- ECLIPSE IDE FOR java EE新版支持PostgreSQL、JPA2.0、JSF 2.0
- Java利用httpasyncclient进行异步HTTP请求