9.1 异步请求处理
- Servlet 3开始支持异步请求处理
- Spring MVC 3.2开始支持Servlet3的这项特性
- controller可以从另外一个线程返回一个
java.util.concurrent.Callable
,而不是一个简单的值- 此时Servlet容器线程已经释放,可以处理其他的请求
- Spring MVC通过借助
TaskExecutor
调起另外一个线程(例子中的mvcTaskExecutor
)
- controller也可以从另外一个线程返回一个
DeferredResult
- 此时,Spring MVC并不知道这个线程的存在
- 比如一个定时任务
9.2 演示
-
在
05点睛Spring MVC 4.1-服务器端推送
中,我们也演示了通过SSE实现长连接- 但在IE的一些版本是不支持的
-
本例通过Spring MVC对异步处理的支持来演示长连接的支持,即服务器端推送
- 支持所有浏览器
-
Servlet开启异步支持
package com.wisely;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration.Dynamic;
import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;
public class WebInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext)
throws ServletException {
AnnotationConfigWebApplicationContext ctx =
new AnnotationConfigWebApplicationContext();
ctx.register(DemoMVCConfig.class);
//注册spring mvc的DispatcherServlet
ctx.setServletContext(servletContext);
Dynamic servlet =
servletContext.addServlet("dispatcher", new DispatcherServlet(ctx));
servlet.addMapping("/");
servlet.setLoadOnStartup(1);
servlet.setAsyncSupported(true);//此句开启
}
}
-
DeferredResult
所需的定时处理
package com.wisely.service;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import org.springframework.web.context.request.async.DeferredResult;
@Service
public class AysncService {
private DeferredResult<String> deferredResult;
public DeferredResult<String> getAsyncUpdate() {
deferredResult = new DeferredResult<String>();
return deferredResult;
}
@Scheduled(fixedDelay = 5000)
public void refresh() {
if (deferredResult != null) {
deferredResult.setResult(new Long(System.currentTimeMillis())
.toString());
}
}
}
- 开启Spring MVC支持配置:继承
WebMvcConfigurerAdapter
的配置类DemoMVCConfig
@Override
public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
configurer.setDefaultTimeout(30*1000L); //tomcat默认10秒
configurer.setTaskExecutor(mvcTaskExecutor());//所借助的TaskExecutor
}
@Bean
public ThreadPoolTaskExecutor mvcTaskExecutor(){
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(10);
executor.setQueueCapacity(100);
executor.setMaxPoolSize(25);
return executor;
}
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/async").setViewName("/async");
}
- 测试控制器
package com.wisely.web;
import java.util.concurrent.Callable;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.context.request.async.DeferredResult;
import com.wisely.service.AysncService;
@Controller
public class AysncController {
@Autowired
AysncService aysncService;
@RequestMapping("/call")
@ResponseBody
public Callable<String> asyncCall() {
//借助mvcTaskExecutor在另外一个线程调用
//此时Servlet容器线程已经释放,可以处理其他的请求
return new Callable<String>() {
@Override
public String call() throws Exception {
Thread.sleep(3000);
return "Async Hello World";
}
};
}
@RequestMapping("/defer")
@ResponseBody
public DeferredResult<String> deferredCall() {
//调用aysncService的getAsyncUpdate方法
//deferredResult被计划任务每五秒钟更新一次
return aysncService.getAsyncUpdate();
}
}
- 测试页面
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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>
<input type="button" value="call" onclick="call();"/>
<input type="button" value="deferred" onclick="deferred();"/>
<script type="text/javascript" src="<c:url value="/js/jquery.js" />"></script>
<script type="text/javascript">
function call(){
$.get('call',function(data){
console.log(data);
});
}
function deferred(){
$.get('defer',function(data){
console.log(data);
deferred();//每次请求完成,再发一次请求,避免客户端定时刷新来获取数据
});
}
</script>
</body>
</html>
新书推荐《JavaEE开发的颠覆者: Spring Boot实战》,涵盖Spring 4.x、Spring MVC 4.x、Spring Boot企业开发实战。
京东地址:http://item.jd.com/11894632.html
当当地址:http://product.dangdang.com/23926195.html
亚马逊地址:http://www.amazon.cn/图书/dp/B01D5ZBFUK/ref=zg_bsnr_663834051_6
淘宝地址:https://item.taobao.com/item.htm?id=528426235744&ns=1&abbucket=8#detail
或自己在京东、淘宝、亚马逊、当当、互动出版社搜索自选。
相关推荐
4. 神经组织:由神经细胞(神经元)和神经胶质细胞构成,负责传递和处理信息,形成神经系统的基础。 在学习和研究中,通过观察人体不同组织的切片,可以更直观地了解这些基本组织的特征、分布和功能。例如,观察...
点睛网赚论坛源码整站程序+10W数据【送主动推送工具】 安装教程https://www.ygwzjs.cn/post/260.html 百度推送工具https://www.ygwzjs.cn/post/181.html 效果演示:z-www.seoheimao.cn 【全新优化】点睛网论坛整站...
4.5.3 服务器端推送技术 106 4.6 Spring MVC 的测试 113 4.6.1 点睛 113 4.6.2 示例 114 第三部分 实战Spring Boot 第5 章 Spring Boot 基础 122 5.1 Spring Boot 概述 122 5.1.1 什么是Spring Boot 122 5.1.2 ...
4.5.3 服务器端推送技术 106 4.6 Spring MVC 的测试 113 4.6.1 点睛 113 4.6.2 示例 114 第三部分 实战Spring Boot 第5 章 Spring Boot 基础 122 5.1 Spring Boot 概述 122 5.1.1 什么是Spring Boot 122 5.1.2 ...
4.5.3 服务器端推送技术 106 4.6 Spring MVC 的测试 113 4.6.1 点睛 113 4.6.2 示例 114 第三部分 实战Spring Boot 第5 章 Spring Boot 基础 122 5.1 Spring Boot 概述 122 5.1.1 什么是Spring Boot 122 5.1.2 ...
STASM4.1是该算法的一个特定版本,提供了对77个关键面部特征点的精确提取,这些特征点包括眼睛、眉毛、鼻子、嘴唇、脸颊等部位的关键点。 1. **STASM算法基础**: STASM基于主动形状模型(Active Shape Model, ASM)...
【全新优化】点睛网论坛整站程序 带全套数据打包(送主动推送工具) 安装教程https://www.ygwzjs.cn/post/260.html 专用收录推送神器https://www.ygwzjs.cn/post/181.html 效果演示:z-www.seoheimao.cn 【全新优化...
国元点睛-20230825-国元期货-23页
bugscan发展历程以及框架改进.pdf 基于正则类sql注入防御的绕过技巧.pdf 如何优雅的穿透linux内网.pdf 花式玩转bugscan插件.pdf 过滤型插件与反向代理的火花.pdf
软件名:点睛文本编码查询 功能:本软件用于将文本的字符串转换为 Text、ASCII、Default、Unicode、BigEndianUnicode、UTF-8、UTF-7、GBK、BIG5 之间的互相转换,用于文本查询。转换结果使用十六进制表示。
点睛网赚论坛源码 网赚项目平台搭建源码+10W数据【送百度秒收录神器】 安装教程https://www.ygwzjs.cn/post/260.html 效果展示http://z-www.seoheimao.cn/ 点睛网论坛整站源码程序+10W+数据(送主动推送工具) ...
"点睛内码转换器"是一款专为处理文本编码问题设计的工具,它能够帮助用户在不同的字符编码之间进行转换,以解决由于编码不匹配导致的乱码问题。在计算机科学领域,字符编码是用于表示文本的一系列规则,常见的有...
《360点睛营销平台多语言加密及调试技术详解》 360点睛营销开放平台是一款由360公司推出的广告投放和营销管理工具,它为开发者提供了丰富的API接口,以帮助开发者构建和优化自己的广告系统。在这个名为"360点睛多...
眼睛穴位图-睛明穴-取穴方法 方便经常上网的朋友使用
使用OpenCV1.0实现了眼睛状态识别,首先用harr检测眼睛,然后用模板匹配的方法标记眼睛状态。 程序需要使用Eyes45x11.xml Mouth25x15.xml Nose25x15.xml,将其放到C:\Program Files\OpenCV\data\haarcascades目录下...
点睛字符替换器v1.05特别修正版是一款针对文本处理的专业软件,主要用于批量替换文本中的特定字符或字符串。这个特别修正版可能是对原始版本的优化和改进,以解决某些问题或添加新功能。在IT领域,字符替换工具是...
本文将深入探讨标题“电信设备-基于人脸检测界面的传媒信息推送方法”所涵盖的知识点,以及描述中提及的核心技术。 1. **人脸检测技术**:人脸检测是计算机视觉领域的一个重要组成部分,它涉及图像处理、模式识别和...
《傲游云浏览器 For Mac:探索智能浏览新体验》 傲游云浏览器是一款深受Mac用户喜爱的网络浏览工具,以其高效、安全、便捷的特点,在众多浏览器中脱颖而出。它集成了多项创新技术,为用户提供了丰富的功能和个性化...
360点睛使用手册是360官方于2019年推出的移动客户端软件,主要功能是推广管理。该手册详细介绍了软件的使用方法和功能特点,适用于广告主进行随时随地的账户投放管理。 首先,手册中的产品介绍部分指出,360点睛是...
当我为 API 编写测试并使用 RSpec 进行调试时,我...git checkout -b my-new-feature ) 提交您的更改( git commit -am 'Add some feature' ) 推送到分支( git push origin my-new-feature ) 创建一个新的拉取请求