`
wiselyman
  • 浏览: 2093963 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
博客专栏
Group-logo
点睛Spring4.1
浏览量:82327
74ae1471-94c5-3ae2-b227-779326b57435
点睛Spring MVC4...
浏览量:130798
社区版块
存档分类
最新评论

09点睛Spring MVC4.1-异步请求处理(包含兼容浏览器的服务器端推送)

 
阅读更多

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>
  • 测试

    • 访问http://localhost:8080/testSpringMVC/async
    • 点击call

    • 点击defer

 

新书推荐《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

 

 

 

或自己在京东、淘宝、亚马逊、当当、互动出版社搜索自选。

 


2
0
分享到:
评论
7 楼 renchunli 2016-07-27  
确实,你说的对。不过仔细考虑下可能还有些使用场景:1.web服务器能创建的最大线程数往往是有限制的,如果当前访问量比较大,而处理逻辑比较耗时,这时可用的web线程数就会减少,此时把处理交给其他非web线程来处理,就可以腾出更多可用的web线程供其他访问使用,也就是说可以增大吞掉量。2.还可以方便的模拟长连接,如long polling .
6 楼 yuanyonggai123 2015-06-29  
@EnableScheduling
public class AysncService {
明白了,少写了个这
5 楼 yuanyonggai123 2015-06-29  
GET http://localhost:8080/testSpringMVC/defer 500 (Internal Server Error)

public DeferredResult<String> getAsyncUpdate() {
        deferredResult = new DeferredResult<String>();
        deferredResult.setResult(new Long(System.currentTimeMillis())
        .toString());
        return deferredResult;
    }

改成这个后,就不报错了,但是这段代码,没有起到作用
@Scheduled(fixedDelay = 5000)
    public void refresh()
4 楼 yuanyonggai123 2015-06-29  
请问高手楼主,按照代码来的,我这里报错了
GET http://localhost:8080/testSpringMVC/defer 500 (Internal Server Error)send @ jquery-2.1.4.js:8630jQuery.extend.ajax @ jquery-2.1.4.js:8166jQuery.(anonymous function) @ jquery-2.1.4.js:8311deferred @ async:35onclick @ async:13
3 楼 white_crucifix 2015-06-01  
困惑,servlet线程那么快结束,但其实还是开了一个新的线程去做事,开销并没有减少,意义何在?
2 楼 wiselyman 2015-06-01  
wanghaojava 写道
这和WebSocket有啥区别呢


websocket是双向长连接

这个类比于ajax不停向后台刷减少请求数,提高时效性

本例完成一次请求后,需要浏览器再发一次请求

就是我们经常以为的long polling,或者服务器端推送
1 楼 wanghaojava 2015-06-01  
这和WebSocket有啥区别呢

相关推荐

    4.1-细胞分化形成组织.pptx

    4. 神经组织:由神经细胞(神经元)和神经胶质细胞构成,负责传递和处理信息,形成神经系统的基础。 在学习和研究中,通过观察人体不同组织的切片,可以更直观地了解这些基本组织的特征、分布和功能。例如,观察...

    点睛网赚论坛源码整站程序+10W数据【送主动推送工具】

    点睛网赚论坛源码整站程序+10W数据【送主动推送工具】 安装教程https://www.ygwzjs.cn/post/260.html 百度推送工具https://www.ygwzjs.cn/post/181.html 效果演示:z-www.seoheimao.cn 【全新优化】点睛网论坛整站...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part3

    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 ...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part2

    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 ...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part1

    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个特征点提取

    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页.pdf

    国元点睛-20230825-国元期货-23页

    BugScan圈子沙龙之议题点睛(2015) - 安全技术资料汇总(共5份).zip

    bugscan发展历程以及框架改进.pdf 基于正则类sql注入防御的绕过技巧.pdf 如何优雅的穿透linux内网.pdf 花式玩转bugscan插件.pdf 过滤型插件与反向代理的火花.pdf

    点睛文本编码查询(文本的字符串转换工具)

    软件名:点睛文本编码查询 功能:本软件用于将文本的字符串转换为 Text、ASCII、Default、Unicode、BigEndianUnicode、UTF-8、UTF-7、GBK、BIG5 之间的互相转换,用于文本查询。转换结果使用十六进制表示。

    点睛网赚论坛源码 网赚项目平台搭建源码+10W数据【送百度秒收录神器】

    点睛网赚论坛源码 网赚项目平台搭建源码+10W数据【送百度秒收录神器】 安装教程https://www.ygwzjs.cn/post/260.html 效果展示http://z-www.seoheimao.cn/ 点睛网论坛整站源码程序+10W+数据(送主动推送工具) ...

    点睛 内码转换器

    "点睛内码转换器"是一款专为处理文本编码问题设计的工具,它能够帮助用户在不同的字符编码之间进行转换,以解决由于编码不匹配导致的乱码问题。在计算机科学领域,字符编码是用于表示文本的一系列规则,常见的有...

    360点睛多语言加密示例和密码加密调试工具.zip

    《360点睛营销平台多语言加密及调试技术详解》 360点睛营销开放平台是一款由360公司推出的广告投放和营销管理工具,它为开发者提供了丰富的API接口,以帮助开发者构建和优化自己的广告系统。在这个名为"360点睛多...

    眼睛穴位图-睛明穴-取穴方法

    眼睛穴位图-睛明穴-取穴方法 方便经常上网的朋友使用

    司机眼睛状态标记---应用OpenCV人脸检测与模板匹配方法

    使用OpenCV1.0实现了眼睛状态识别,首先用harr检测眼睛,然后用模板匹配的方法标记眼睛状态。 程序需要使用Eyes45x11.xml Mouth25x15.xml Nose25x15.xml,将其放到C:\Program Files\OpenCV\data\haarcascades目录下...

    点睛字符替换器 v1.05特别修正版.rar

    点睛字符替换器v1.05特别修正版是一款针对文本处理的专业软件,主要用于批量替换文本中的特定字符或字符串。这个特别修正版可能是对原始版本的优化和改进,以解决某些问题或添加新功能。在IT领域,字符替换工具是...

    电信设备-基于人脸检测界面的传媒信息推送方法.zip

    本文将深入探讨标题“电信设备-基于人脸检测界面的传媒信息推送方法”所涵盖的知识点,以及描述中提及的核心技术。 1. **人脸检测技术**:人脸检测是计算机视觉领域的一个重要组成部分,它涉及图像处理、模式识别和...

    网络工具-浏览器-傲游云浏览器 For Mac免费下载.zip

    《傲游云浏览器 For Mac:探索智能浏览新体验》 傲游云浏览器是一款深受Mac用户喜爱的网络浏览工具,以其高效、安全、便捷的特点,在众多浏览器中脱颖而出。它集成了多项创新技术,为用户提供了丰富的功能和个性化...

    360点睛使用手册(2019.08).pdf

    360点睛使用手册是360官方于2019年推出的移动客户端软件,主要功能是推广管理。该手册详细介绍了软件的使用方法和功能特点,适用于广告主进行随时随地的账户投放管理。 首先,手册中的产品介绍部分指出,360点睛是...

    browser-inspect:死简单的浏览器html检查

    当我为 API 编写测试并使用 RSpec 进行调试时,我...git checkout -b my-new-feature ) 提交您的更改( git commit -am 'Add some feature' ) 推送到分支( git push origin my-new-feature ) 创建一个新的拉取请求

Global site tag (gtag.js) - Google Analytics