使用SseEmitter不断向网页输出结果
2018-01-19 00:00
246 查看
序
之前写过一篇文章:springmvc不断输出文本到网页,采用的是对response不断进行write和flush实现的。在spring 4.2版本的时候提供了一个SseEmitter可以直接用来实现这个功能。实例
@Controller @RequestMapping("/sse") public class SseEmitterController { private static final Logger LOGGER = LoggerFactory.getLogger(SseEmitterController.class); @Autowired @Qualifier("mvcTaskExecutor") ThreadPoolTaskExecutor mvcTaskExecutor; @GetMapping("") public SseEmitter sseDemo() throws InterruptedException { final SseEmitter emitter = new SseEmitter(0L); //timeout设置为0表示不超时 mvcTaskExecutor.execute(() -> { try { for(int i=0;i<100;i++){ emitter.send("hello"+i); LOGGER.info("emit:{}","hello"+i); Thread.sleep(1000*1); } emitter.complete(); } catch (Exception e) { emitter.completeWithError(e); } }); return emitter; } }
输出实例
data:"hello0" data:"hello1" data:"hello2" data:"hello3" data:"hello4" data:"hello5" //......
注意事项
这里的SseEmitter的send不能阻塞mvc线程,必须提前返回,然后把send放到异步里头除了使用上述的放入线程池的方式,也可以直接调用标记有async的方法
这里SseEmitter的timeout设置为0,表示不超时.
如果不设置为0,那么如果SseEmitter在指定的时间(
AsyncSupportConfigurer设置的timeout,默认为30秒)未完成会抛出异常
org.springframework.web.context.request.async.AsyncRequestTimeoutException: null at org.springframework.web.context.request.async.TimeoutDeferredResultProcessingInterceptor.handleTimeout(TimeoutDeferredResultProcessingInterceptor.java:42) ~[spring-web-4.3.10.RELEASE.jar:4.3.10.RELEASE] at org.springframework.web.context.request.async.DeferredResultInterceptorChain.triggerAfterTimeout(DeferredResultInterceptorChain.java:75) ~[spring-web-4.3.10.RELEASE.jar:4.3.10.RELEASE] at org.springframework.web.context.request.async.WebAsyncManager$5.run(WebAsyncManager.java:392) ~[spring-web-4.3.10.RELEASE.jar:4.3.10.RELEASE] at org.springframework.web.context.request.async.StandardServletAsyncWebRequest.onTimeout(StandardServletAsyncWebRequest.java:143) ~[spring-web-4.3.10.RELEASE.jar:4.3.10.RELEASE] at org.apache.catalina.core.AsyncListenerWrapper.fireOnTimeout(AsyncListenerWrapper.java:44) ~[tomcat-embed-core-8.5.16.jar:8.5.16] at org.apache.catalina.core.AsyncContextImpl.timeout(AsyncContextImpl.java:134) ~[tomcat-embed-core-8.5.16.jar:8.5.16] at org.apache.catalina.connector.CoyoteAdapter.asyncDispatch(CoyoteAdapter.java:153) ~[tomcat-embed-core-8.5.16.jar:8.5.16] at org.apache.coyote.AbstractProcessor.dispatch(AbstractProcessor.java:224) ~[tomcat-embed-core-8.5.16.jar:8.5.16] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:53) ~[tomcat-embed-core-8.5.16.jar:8.5.16] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) ~[tomcat-embed-core-8.5.16.jar:8.5.16] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1455) ~[tomcat-embed-core-8.5.16.jar:8.5.16] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.16.jar:8.5.16] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1. 8000 8.0_71] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_71] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.16.jar:8.5.16] at java.lang.Thread.run(Thread.java:745) [na:1.8.0_71]
小结
SseEmitter在运行比较耗时的任务时非常好用,比如实时查看部署进度,比如查看定时任务的实时输出等。doc
SseEmitterspringmvc不断输出文本到网页
实现后台长时间任务的监控
理解Spring MVC中的异步处理请求(下)
相关文章推荐
- c++使用动态规划dp(自底向上)重构解决钢条切割输出最大收益和切割方案及运行实例结果
- 使用Messenger 从Activity发送数据到service 通过后台计算结果Log输出;
- 使用ab压测网页结果分析
- mapreduce输出时按情况使用不同的文件名输出结果
- Android单元测试时如何使用log查看输出结果
- (本程序功能:字符串A中找出包含字符串B中所有字符的位置并输出) 在使用全局变量m的时候,输出错误的结果,而用下面局部变量M就没问题。
- c++使用动态规划dp(自底向上)重构解决钢条切割输出最大收益和切割方案及运行实例结果
- 网页CSS背景图片使用的测试结果
- error:使用rebuild编译链接dll文件和exe文件,结果改变产生dll的源文件的内容,输出结果都没有改变
- 开发者使用JasperReport——报表输出到网页
- 《程序员的第一年》---------- 【抓取网页数据】定时查寻淘宝搜索结果并用excel记录下来(HttpWebRequest与正则等的使用)
- 使用TextTest来做认定测试——本质是通过diff对比程序的运行log输出,来看测试结果和预期结果是否相同
- 使用prompt输入一句英文句子和排序方式(升/降),将所有单词按排序方式排序后在网页上输出
- c++使用动态规划dp(自底向上)重构解决钢条切割输出最大收益和切割方案及运行实例结果
- ajax异步加载使用post方法时一直输出相同结果,不能实现翻页
- 在AWK中执行命令并使用getline输出全部结果
- C# WinForm使用用CMD命令并输出结果到TextBox
- TF:Tensorflow之session会话的使用,定义两个矩阵,两种方法输出2个矩阵相乘的结果—Jason niu
- 使用shell+awk完成Hive查询结果格式化输出
- 使用列表解析式输出以下结果 ''' ['0000', '0001', '0002', '0003', '0004', '0005', '0006', '0007', '0008', '0009'] '