当客户端向服务端发请求,服务端抓住请求不放,
-
SSE(server send event)
需要新式浏览器
每5秒向浏览器推送消息
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind. annotation.ResponseBody;
@Controller
public class SseController{
@RequestMapping (value=" /push",produces="text/event-stream")
public @ResponseBody String push() {
Random r = new Random() ;
try{
Thread.sleep(5000);
} catch (InterruptedException e){
e.printStackTrace();
}
return "data:Testing 1,2,3" + r.nextInt() +"\n\n";
}
使用输出媒体类型:text/event-stream,这是服务端SSE的支持
-
基于servlet3.0的异步方法
跨浏览器
- DeferredResult:当一个请求到达API接口,如果该API接口的return返回值是DeferredResult,在没有超时或者DeferredResult对象设置setResult时,接口不会返回,但是Servlet容器线程会结束,DeferredResult另起线程来进行结果处理(即这种操作提升了服务短时间的吞吐能力)。前台页面打开时向后台发送请求–获取数据–一次请求完再向后台发送请求
- @Async:在启动类或者配置类上使用@EnableAsync,在对应的service方法上使用@Async,使得方法异步
-
扩展 使用callable处理service中业务超时
集成callable开始线程执行任务,使用Future指定时间获取返回值,返回异常表示任务未执行完毕