导读
这一节我们主要来看看Spring+Callable、Spring WebAsyncTask以及Future+@Async如何来实现长轮询?
大家会看到,我这里的的描述中,有些是使用+的方式来进行表述,为什么这么表达呢?带着你的疑问,开启本文的阅读之旅吧。
长轮询系列:
(1)✅《什么是轮询、长轮询、长连接一篇文章让你不在懵懂》
(2)✅《Spring Boot使用Servlet居然也可以实现长轮询》
(3)✅《Spring Boot使用Spring DeferredResult实现长轮询,纵享新丝滑让你体验丝滑般的感觉》
(4)✅《Spring Boot使用Spring Callable和WebAsyncTask实现长轮询,战斗力杠杠的》
(5)✅《Spring Boot使用Future+@Async实现长轮询》
(6)「待定」《网友直呼:DeferredResult是Spring对Servlet异步处理的包装吗?》
这一节我们先来看看《Spring Boot使用Spring Callable和WebAsyncTask实现长轮询,战斗力杠杠的》以及《Spring Boot使用Future+@Async实现长轮询》
一、何为Callable和WebAsyncTask
1.1何为Callable?
面试官:线程的实现方式有几种?
面试者:2种,继承Thread类,实现Runnable接口。
面试者正沉浸在自己以为完美的回答中的时候,这时面试官紧接着来了一个灵魂拷问:还有其它的实现方式吗?
此时,面试者一脸懵逼了,纳尼,还有其它的方式吗?
这就是我们要讲到的接口Callable。
Callable和Runnable的区别是Callable可以有返回值,也可以抛出异常的特性,而Runnable没有。
对于Callable的使用,我在很久很久很久以前(2020年1月7日),写过一篇文章:《我按摩你泡脚,你居然不等我「牛逼的Future」 - 第294篇》,大家看完这篇文章就知道Callable怎么使用了,文章地址:
https://mp.weixin.qq.com/s/Ztg7pwi2YFhQhYOaOhw5hw
当然也可以关注公众号「SpringBoot」,,回复关键词「future」,进行文章的查看。
1.1.1 Callable使用的简单总结
对于Callable的具体使用,这里不重复说明,但总结重要的几点:
(1)接口Callable:Callable是一个接口,也就是具体的业务处理,如果只是实现了一个Callable,它自己并不能有啥效果,就如同Runnable还需要配合Thread进行启动。
(2)类FutureTask:对于Callable的数据如何获取呢,那么需要使用FutureTask来进行接收,在初始化FutureTask的时候,在构造方法将Callable传进去。
(3)Thread:最终如何启动呢?还是需要使用Thread进行启动,FutureTask也实现了接口Runnable,可以作为一个此参数传给Thread。
说这么多,还不如代码看下代码明了:
上面可能你有些代码可能看不懂,这是Lambda表达式对于代码的简写,JDK8的特性,还不懂的话,关注公众号「SpringBoot」,回复关键词「lambda」,查看Lambada表达式的系列文章:
《Java8新特性:Lambda表达式:小试牛刀》
《Java8新特性:Lambda表达式:过关斩将:使用场景》
《Java8新特性:Lambda表达式:摸摸里面》
1.1.2 Spring+Callable讲产生神奇的化学反应
这里我们看到Callable(java.util.concurrent包下)是独立的存在,和Spring并没有太直接的关系,所以我们前面使用了+的方式,也就是说Spring+Callable将会产生神奇的化学反应,什么FutureTask、什么Thread在你可视范围将不复存在。(当然这是底层帮你处理了而已)
1.2何为WebAsyncTask?
Spring 提供了对 异步任务 API, 采用 WebAsyncTask 类即可实现 异步任务. 对异步任务设置相应的 回调处理, 如当 任务超时, 异常抛出 等. 异步任务通常非常实用, 比如: 当一笔订单支付完成之后, 开启异步任务查询订单的支付结果。
简单来说:WebAsyncTask类是Spring提供的一步任务处理类。
另外要知道的一点就是:WebAsyncTask是Callable的升级版。
二、Spring+Callable
2.1 例子说明
接下里我们会使用一个小栗子来演示使用Spring+Callable的异步处理来实现长轮询。
对于这个例子先总体的说明下:
(1)有一个页面会使用ajax定时的请求后台,5秒一请求,看是否有新的信息发布。
(2)后端接收到请求之后会使用Spring+Callable的异步处理请求,如果此时没有新的信息的话,那么等待超时。
(3)打开新的一个窗口,调用发布新的消息的请求发布新消息。
(4)此时ajax定时请求的页面,应该会及时的显示新的信息。
2.2 环境说明
(1)OS:Mac OS
(2)开发工具:IntelliJ Idea
(3)JDK:1.8
(4)Spring Boot:2.6.1
2.3 开发步骤
(1)构建一个基本的Spring Boot框架
(2)构建一个发布请求的Controller
(3)构建一个页面定时请求后台的Controller
(4)启动测试
。。。。。。。。。。。。。。。。。版权原因,完整文章,请参考如下:
Spring Boot使用Spring Callable和WebAsyncTask实现长轮询,战斗力杠杠的,这一节知识点满满的 - 第415篇