在我们的最后一集中 , 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); } }

同样,像其对应的SimpleMatchUpdateServiceDeferredResultService包含两个方法: subscribe()getUpdate()

与处理getUpdate(...)它的作用是为新创建的添加DeferredResult对象到LinkedBlockingQueueresultQueue ,以便它可以在以后当比赛更新可用来处理。

实际工作是通过subscribe()方法完成的。 首先,此方法启动matchReporter ,它在适当的时候将匹配更新输入到自动装配的queue实例中。 然后,它调用私有的startThread()方法来启动工作线程。 该操作仅启动一次,并使用双重检查锁定来确保高效且没有问题。

线程的run()方法首先无限循环,从resultQueue (如果有)中获取DeferredResult对象,然后是Message对象,该对象代表来自update queue的匹配更新(如果有)。 然后,使用message对象作为参数调用DeferredResultsetResult(...) 。 Spring现在将接管工作,原始的长轮询请求将完成,并且数据将延迟地返回给浏览器。

请注意,在此示例代码中, run()方法包含while(true)循环。 尽管此技术简化了示例代码,但在生产代码方面并不是一个好主意。 使用任性的不受控制的线程的问题之一是它们会阻止Tomcat正确关闭,并且您通常必须使用良好的Unix kill命令来停止服务器。 在生产代码中,最好包含代码以正常关闭此类工作线程。

经过数小时的辛苦工作,Java / Spring顾问将其代码推广到生活中,拿起保时捷的钥匙,然后旋转一下。 下个星期六,使用Spring的DeferredResult ,服务器可以很好地应对:用户很高兴,电视公司的总裁很高兴, Agile Cowboys Inc的首席执行官很高兴,尽管他一直怀疑自己付给顾问的钱太多了,嘿,这只是钱。

1在撰写此博客时,我使用的是Tomcat 7.0.42版

该博客随附的代码可在Github上找到: https : //github.com/roghughe/captaindebug/tree/master/long-poll

参考: Captain Debug博客博客中来自JCG合作伙伴 Roger Hughes的Spring 3.2的DeferredResult长轮询 。

翻译自: https://www.javacodegeeks.com/2013/09/long-polling-with-spring-3-2s-deferredresult.html

使用Spring 3.2的DeferredResult进行长轮询相关推荐

  1. .xhr长轮询_使用Spring 3.2的DeferredResult进行长轮询

    .xhr长轮询 在我们的最后一集中 , Agile Cowboys Inc.的首席执行官刚刚雇用了Java / Spring顾问,方法是为他提供最初为女友购买的保时捷. 这位首席执行官的女友因失去保时 ...

  2. Spring Boot使用Spring DeferredResult实现长轮询,纵享新丝滑让你体验丝滑般的感觉 - 第414篇

    相关历史文章(阅读本文前,您可能需要先看下之前的系列

  3. java 长轮询_java – Spring中的长轮询

    我们有一个独特的案例,我们需要与外部API接口,这需要我们长时间轮询他们的端点以获得他们所谓的实时事件. 问题是我们可能有多达80,000人/设备在任何给定时间点击此端点,监听事件,每个设备/人1个连 ...

  4. qt websocket android,QT使用websocket进行长连接

    一般我们用的最多的就是http请求,但是频繁的请求可能对服务造成的压力很大,所以今天谈谈websocket长连接,一句话:简单 1.什么是长连接? A:一次请求连接,终身使用,就可以长久的保持信息的交 ...

  5. 昆虫基因组DNA的优化提取,可进行长读测序

    昆虫基因组DNA的优化提取,可进行长读测序 通过 布伦达·奥珀特(Brenda Oppert) 1,*, 萨曼莎·斯托斯(Samantha Stoss) 1个, 阿莱莎和尚 1个 和 蒂莫西·史密斯 ...

  6. R语言进行长宽数据转换

    长宽数据 在日常数据分析过程中,经常会对数据进行长宽转换处理,所谓长宽数据转换就是将数据表中的列变量进行聚合和分裂操作.宽转长:多个列聚合为一列,同时生成value值,这种操作主要是为了方便ggplo ...

  7. Android 后台进行长图的生成并分享(非长截图)

    DrawLongPictureDemo 项目地址:SherlockGougou/DrawLongPictureDemo  简介:Android 后台进行长图的生成并分享(非长截图) 更多:作者   提 ...

  8. 利用opencv对图像进行长曝光

    利用opencv对图像进行长曝光 本文首发于公众号[Opencv视觉实践],翻译自光头哥哥的博客: [Long exposure with OpenCV and Python],仅做学习分享. 原文链 ...

  9. 使用pivot_longer和pivot_wider进行长宽数据转换

    获取更多R语言和生信知识,请欢迎关注公众号:医学和生信笔记 医学和生信笔记 公众号主要分享:1.医学小知识.肛肠科小知识:2.R语言和Python相关的数据分析.可视化.机器学习等:3.生物信息学学习 ...

最新文章

  1. powershell 自动从组中移除禁用的账号
  2. IT英语6-Java常用英语词汇总结
  3. JS的window.parent ,window.top,window.self
  4. unity3d 随机生成地形之随机山脉
  5. 产品经理十二时辰:内容过于真实,扎心了!
  6. 差分放大电路单端输出和双端输出区别以及应用(转载)
  7. Think in Java第四版 读书笔记10 第16章 数组
  8. jstat分析JVM内存
  9. android自定义进度条_Android中的自定义进度栏
  10. win10下装黑苹果双系统_黑苹果10.15.5系统与win10双系统镜像下载
  11. Android | Sensor.TYPE_ORIENTATION被废弃后的解决办法
  12. mybatis一对多关联查询分页解决方案
  13. 从0到1智能风控决策引擎构建
  14. 用python实现分段函数_python:集成分段函数
  15. 图片放大不模糊,如何实现?
  16. 声波正演c语言程序,二维频率域声波方程正演模拟
  17. nginx负载均衡之一致性Hash方式
  18. FW: 业精于勤:量级与数量级的差异
  19. Python Web 菜谱项目再次前进一步,从应用层了解内置用户认证系统
  20. android动画光影效果图,光影游戏(二):用手机 App 制作电影海报风格图片

热门文章

  1. c语言 葬礼分号,其实从C语言用分号结尾开始,就是一个悲剧了……
  2. discuz 版块导航function_forumlist.php,Discuz! X2“扩建”左侧版块导航 让社区层次一目了然...
  3. 网络——获取Web数
  4. java集合框架——接口图+类图+遗留类图
  5. jsf 项目_您将在下一个项目中使用JSF吗?
  6. raii_Java中的RAII
  7. vaadin_Vaadin和DukeScript中的Hello World
  8. primefaces_使用PrimeFaces开发数据导出实用程序
  9. java 排序性能_Java8排序–性能陷阱
  10. Apache Ranger插件的美丽简洁