博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
⑩异步处理
阅读量:7088 次
发布时间:2019-06-28

本文共 3093 字,大约阅读时间需要 10 分钟。

前言

  系列出品:

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("异步调用示例");        out.println("进入Servlet的时间:"+new Date()+".
"); out.flush(); //创建AsyncContext,开始异步调用 AsyncContext actx = request.startAsync(); //设置异步调用的超时时长 actx.setTimeout(30*1000); //启动异步调用的线程 actx.start(new Executor(actx)); out.println("结束Servlet的时间:"+new Date()+".
"); 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
books = new ArrayList
(); 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" %>
Insert title here
  • ${book }
<%out.println("业务调用结束的时间:"+ new Date()); //完成异步调用 //request.getAsyncContext().complete();%>

 

 

转载地址:http://ccfql.baihongyu.com/

你可能感兴趣的文章
python开源项目及示例代码
查看>>
MySQL集群简介与配置详解
查看>>
linux命令:grub 文件详解及grub修复,系统常见故障修复
查看>>
RHEL7 Or CentOS7下配置aliyun-epel和fedora的EPEL源
查看>>
Oracle Database 12c新特性汇总页面
查看>>
Exchange 2016 数据库副本自动分配新功能
查看>>
解决 WP迁移后出现的404错误
查看>>
Python 学习日记第四篇 -- 函数,文件
查看>>
docker运行nginx为什么要使用 daemon off
查看>>
Linux 系统里用户管理
查看>>
上汽集团数据业务部高级总监刘峰:突破瓶颈 激发数据生产力
查看>>
跟我一起数据挖掘(20)——网站日志挖掘
查看>>
HTTPS部署笔记
查看>>
如何优雅的编写 JavaScript 代码
查看>>
MySQL 聚合函数
查看>>
Ubuntu16.10安装Ocata之2:Keystone
查看>>
IGMPv3
查看>>
ZeroMQ(java)之Router/Dealer模式
查看>>
Linux下的文件查找命令
查看>>
TCP/IP协议碎碎念
查看>>