.xhr长轮询_使用Spring 3.2的DeferredResult进行长轮询
.xhr长轮询
在我们的最后一集中 , Agile Cowboys Inc.的首席执行官刚刚雇用了Java / Spring顾问,方法是为他提供最初为女友购买的保时捷。 这位首席执行官的女友因失去保时捷而感到不安,已将其婚外恋告诉了他的妻子。 他的妻子在分拆了CEO的套房后已申请离婚。 同时,首席执行官在办公室实施了新的“休闲”着装要求,而Java / Spring顾问刚从他的新保时捷换来的回程中,正坐在办公桌旁准备修理电视公司的软件……如果不这样做的话对您没有任何意义,然后看一下使用Spring的Long Polling Tomcat 。
Java / Spring顾问必须在下一个大型游戏之前解决电视公司的服务器资源问题,他知道他可以通过使用在Tomcat 7 1上实现的Servlet 3规范实现Spring的Deferred Result技术来解决此问题。
Java / Spring顾问要做的第一件事是检查 项目的pom.xml
文件。 对于异步Servlet 3项目,您必须包括以下依赖项:
<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.0.1</version><scope>provided</scope></dependency>
接下来,您必须告诉Tomcat Spring DispatcherServlet
支持Servlet 3异步通信。 这是通过将以下行添加到web.xml
:
<async-supported>true</async-supported>
完整的DispatcherServlet
配置为:
<servlet><servlet-name>appServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value></init-param><load-on-startup>1</load-on-startup><async-supported>true</async-supported></servlet>
整理完项目配置后,Java / Spring ConsultantSwift进入了控制器代码。 他用新的DeferredMatchUpdateController
替换了研究生培训生的SimpleMatchUpdateController
:
@Controller()
public class DeferredMatchUpdateController { @Autowired private DeferredResultService updateService; @RequestMapping(value = "/matchupdate/begin" + "", method = RequestMethod.GET) @ResponseBody public String start() { updateService.subscribe(); return "OK"; } @RequestMapping("/matchupdate/deferred") @ResponseBody public DeferredResult<Message> getUpdate() { final DeferredResult<Message> result = new DeferredResult<Message>(); updateService.getUpdate(result); return result; }
}
新的DeferredMatchUpdateController
非常简单。 与SimpleMatchUpdateController
一样,它包含两个方法: start()
和getUpdate()
,它们的功能与简单方法完全相同。 这使该控制器成为SimpleMatchUpdateController
的插件替代品。 最大的不同是, getUpdate()
方法创建Spring的DeferredResult
的实例,该实例在将其返回给Spring之前传递给新的DeferredResultService
。 然后,Spring停放HTTP请求,使其挂起,直到DeferredResult
对象具有一些要返回到浏览器的数据为止。
@Service("DeferredService")
public class DeferredResultService implements Runnable { private static final Logger logger = LoggerFactory.getLogger(DeferredResultService.class); private final BlockingQueue<DeferredResult<Message>> resultQueue = new LinkedBlockingQueue<>(); private Thread thread; private volatile boolean start = true; @Autowired @Qualifier("theQueue") private LinkedBlockingQueue<Message> queue; @Autowired @Qualifier("BillSkyes") private MatchReporter matchReporter; public void subscribe() { logger.info("Starting server"); matchReporter.start(); startThread(); } private void startThread() { if (start) { synchronized (this) { if (start) { start = false; thread = new Thread(this, "Studio Teletype"); thread.start(); } } } } @Override public void run() { while (true) { try { DeferredResult<Message> result = resultQueue.take(); Message message = queue.take(); result.setResult(message); } catch (InterruptedException e) { throw new UpdateException("Cannot get latest update. " + e.getMessage(), e); } } } public void getUpdate(DeferredResult<Message> result) { resultQueue.add(result); } }
同样,像其对应的SimpleMatchUpdateService
, DeferredResultService
包含两个方法: subscribe()
和getUpdate()
与处理getUpdate(...)
它的作用是为新创建的添加DeferredResult
对象到LinkedBlockingQueue
叫resultQueue
,以便它可以在以后当比赛更新可用来处理。
真正的工作是通过subscribe()
方法完成的。 首先,此方法启动matchReporter
,它在适当的时候将匹配更新输入到自动连接的queue
实例中。 然后,它调用私有的startThread()
方法来启动工作线程。 该操作仅启动一次,并使用双重检查锁定来确保高效且没有问题。
线程的run()
方法首先无限循环,从resultQueue
获取DeferredResult
对象(如果有),然后从Message
对象中获取代表来自更新queue
的匹配更新的Message
对象(如果有)。 然后,使用message
对象作为参数调用DeferredResult
的setResult(...)
。 Spring现在将接管工作,原始的长轮询请求将完成,并且数据将延迟地返回给浏览器。
请注意,在此示例代码中,
run()
方法包含while(true)
循环。 尽管此技术简化了示例代码,但在生产代码方面并不是一个好主意。 使用不受控制的不受控制的线程的问题之一是它们会阻止Tomcat正确关闭,并且您通常必须使用良好的Unixkill
命令来停止服务器。 在生产代码中,最好包含代码以正常关闭此类工作线程。
经过数小时的辛苦工作后,Java / Spring顾问将其代码推广到生活中,拿起保时捷的钥匙,然后旋转一下。 下个星期六,使用Spring的DeferredResult
,服务器可以很好地应对:用户很高兴,电视公司的总裁很高兴, Agile Cowboys Inc的首席执行官很高兴,尽管他一直怀疑自己付给顾问的钱太多了,但是,这只是金钱。
1在撰写此博客时,我使用的是Tomcat 7.0.42版
该博客随附的代码可在Github上找到: https : //github.com/roghughe/captaindebug/tree/master/long-poll
翻译自: https://www.javacodegeeks.com/2013/09/long-polling-with-spring-3-2s-deferredresult.html
.xhr长轮询
.xhr长轮询_使用Spring 3.2的DeferredResult进行长轮询相关推荐
- 使用Spring 3.2的DeferredResult进行长轮询
在我们的最后一集中 , Agile Cowboys Inc.的首席执行官刚刚雇用了Java / Spring顾问,方法是为他提供最初为女友购买的保时捷. 这位首席执行官的女友因失去保时捷而感到不安,已 ...
- usb端点轮询_使用Spring Integration轮询http端点
usb端点轮询 如果您想用Spring Integration编写一个流程来轮询HTTP端点并从http端点收集一些内容以进行进一步处理,那有点不直观. Spring Integration提供了几种 ...
- tomcat 轮询_用Spring长轮询Tomcat
tomcat 轮询 就像喜剧演员弗兰基· 豪威尔 ( Frankie Howerd)所说的"噢,小姐小姐" ,但足够多的英国影射和双重诱惑,因为长轮询Tomcat对隔壁的闷气不是某 ...
- mysql 长轮询_基于HTTP长轮询实现简单推送
应用场景:设备为安卓.PC以及服务器,要求PC端能够单向给移动端发送消息指令,安卓端解析消息,进行后续处理动作.其中安卓端为基于Phonegap开发,说白了,就是HTML+JS. 规模:正常应用为20 ...
- java前端长连接框架_Java中Spring Boot+Socket实现与html页面的长连接实例详解
Spring Boot+Socket实现与html页面的长连接,客户端给服务器端发消息,服务器给客户端轮询发送消息,附案例源码 功能介绍 客户端给所有在线用户发送消息客户端给指定在线用户发送消息服务器 ...
- java 时间轮算法_时间轮算法(TimingWheel)是如何实现的?
前言 我在2. SOFAJRaft源码分析-JRaft的定时任务调度器是怎么做的?这篇文章里已经讲解过时间轮算法在JRaft中是怎么应用的,但是我感觉我并没有讲解清楚这个东西,导致看了这篇文章依然和没 ...
- 磁悬浮惯性动量轮技术_第1章_绪论
绪论 1.1 惯性执行机构概述 1.2 惯性执行机构工作原理及分类 1.2.1 惯性执行机构工作原理 1.2.2 惯性执行机构分类 1.2.2.1 分类一(角动量大小和方向的变化方式) 1.2.2.2 ...
- 广告轮播java_[springboot 开发单体web shop] 6. 商品分类和轮播广告展示
商品分类&轮播广告 因最近又被困在了OSGI技术POC,更新进度有点慢,希望大家不要怪罪哦. 上节 我们实现了登录之后前端的展示,如: 接着,我们来实现左侧分类栏目的功能. 商品分类|Prod ...
- HTML中轮播图里的圆点不充满,老师好,轮播图中的小点不显示
我设置了padding-botom 为40%还是不显示,请麻烦看一下这是什么问题呢 import { Swiper, SwiperItem } from "@/common/swiper&q ...
最新文章
- python中平均值函数_python自定义函数ma(x,y)求简单平均值输出结果到列表
- vue indev.html,webpack多入口热加载很慢
- SQL Server 索引结构及其使用(二)
- 200910阶段一C++虚析构
- 洛谷 3953 NOIP2017提高组Day1 T3 逛公园
- Python机器学习---2.聚类分析代码部分
- leetcode383. 赎金信(两种做法)
- 7价 半导体掺杂_天津大学封伟团队:新型半导体二维原子晶体锗硅烷材料的带隙调控...
- Java基础学习总结(121)——Java JVM执行流程
- 十八、泛型 l 注解 l Servlet3.0 l 动态代理 l 类加载器基础加强
- PECL PEAR php扩展模块的简便安装方式
- 的大小name转为小写_linux 进程 -- ps -ef|grep process_name
- android 打开微信代码,微信跳转浏览器或提示手机端打开HTML代码
- QTcpServer和QTcpSocket使用详解
- 将类似html数据打印机,白激光打印机的工作原理.doc
- sinc函数卷积_两个矩形窗函数的卷积
- chia/xch rpc形式充提生成地址
- 生活中的一些哲理名言
- 求一个序列所有区间不同数的个数之和
- python《打气球》小游戏(二)