异步处理

简介:

Servlet3.0提供异步处理

  在以前的Servlet规范化,如果Servlet作为控制器调用了一个耗时的业务方法,那么必须等到业务方法完全返回之后才能生成响应,这将使用Servlet对业务方法的调用变成一种阻塞式的调用,因此效率比较低。

  Servlet3.0规范引入了异步处理来解决这个问题,异步处理允许Servlet重新发起一条新线程去调用 耗时业务方法,这样就可以避免等待。
Servlet3.0的异步处理是通过AsyncContext类来处理的,Servlet可通过ServletRequest的如下两个方法开启异步调用,创建AsyncContext对象:

AsyncContext startAsync()

AsyncContext startAsync(ServletRequest,ServletResponse)

 

异步处理类AsyncServlet.java


package aniyo.servlet.async;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

import javax.servlet.AsyncContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet 3.0提供的异步处理
 * 异步操作通过AsyncContext类来处理,通过startAsync()方法来开启异步调用 
 * @author aniyo
 * blog:http://aniyo.iteye.com
 *
 */
@WebServlet(name="asyncServle",urlPatterns="/asyncServlet",asyncSupported=true)
public class AsyncServlet extends HttpServlet {

    /* (non-Javadoc)
     * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=GBK");
        PrintWriter out = response.getWriter();
        out.println("<title>异步调用示例</title>");
        out.println("进入Servlet的时间:"+new Date()+".<br/>");
        out.flush();
        //创建AsyncContext,开始异步调用
        AsyncContext actx = request.startAsync();
        //设置异步调用的超时时长
        actx.setTimeout(30*1000);
        //启动异步调用的线程
        actx.start(new Executor(actx));
        out.println("结束Servlet的时间:"+new Date()+".<br/>");
        out.flush();
    }
}

 

线程类Executor.java


package aniyo.servlet.async;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.AsyncContext;
import javax.servlet.ServletRequest;

public class Executor implements Runnable{
    private AsyncContext actx = null;
    
    public Executor(AsyncContext actx) {
        this.actx = actx;
    }

    /* (non-Javadoc)
     * @see java.lang.Runnable#run()
     */
    @Override
    public void run() {

        //等待5秒
        try {
            Thread.sleep(5*1000);
            ServletRequest request = actx.getRequest();
            List<String> books = new ArrayList<String>();
            books.add("java");
            books.add("oracle");
            books.add("j2ee");
            request.setAttribute("books", books);
            actx.dispatch("/async.jsp");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
    }

    

    
}

async.jsp


<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" session="false"%>
    <%@ taglib prefix = "c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<ul>
    <c:forEach items="${books}" var="book">
        <li>
            ${book }
        </li>
    </c:forEach>
</ul>
<%out.println("业务调用结束的时间:"+ new Date());
    //完成异步调用
    //request.getAsyncContext().complete();
%>
</body>
</html>



相关文章
|
1天前
|
Java 数据库 UED
多线程业务异步处理
多线程业务异步处理
|
5月前
|
监控
异步处理机制如何处理消息处理失败的情况?
异步处理机制如何处理消息处理失败的情况?
51 0
|
5月前
|
消息中间件 监控 JavaScript
消息队列和事件循环
消息队列和事件循环
47 0
|
7月前
|
Java 数据库 数据安全/隐私保护
【CompletableFuture事件驱动异步回调】
【CompletableFuture事件驱动异步回调】
|
9月前
|
消息中间件 存储 监控
消息队列与任务队列的区别
消息队列和任务队列是我们在软件系统中常常遇到的概念。尽管它们的名字相似,但实际上它们有不同的用途和工作原理。本文将介绍消息队列和任务队列之间的区别。
355 0
|
10月前
|
前端开发 Java Spring
SpringMVC 如何实现异步处理及内置异步请求类介绍
SpringMVC 如何实现异步处理及内置异步请求类介绍
75 1
|
10月前
|
JavaScript Java UED
CompletableFuture 异步处理
CompletableFuture 异步处理
85 0
|
消息中间件 缓存 前端开发
同步转异步处理|学习笔记
快速学习同步转异步处理
261 0
同步转异步处理|学习笔记
|
消息中间件 缓存 前端开发
同步转异步处理|学习笔记
快速学习同步转异步处理
131 0
同步转异步处理|学习笔记
|
消息中间件 Java 编译器
线程池优化消息发送|学习笔记
快速学习线程池优化消息发送
70 0