JFinal里的SseEmitter有两种场景使用方式
都是在Controller里,因为SSE基于http。
一、主线程里推送数据到客户端
/** * 主线程里 * 测试本地发送文本打字机 */ public void sse1() throws InterruptedException { //创建sse SseEmitter sseEmitter = new SseEmitter(getResponse()); //主线程里拿到数据推送消息 String[] datas = msg.split(""); for(String data:datas){ //推送 sseEmitter.sendMessage(data); Thread.sleep(50); } //sse完成 sseEmitter.complete(); //结束response renderNull(); }
二、子线程里异步处理资源数据准备然后异步推送
这种情况需要主线程等待子线程完成。
/** * 异步子线程模拟 * 测试本地发送文本打字机 */ public void sse2(){ //创建sse final SseEmitter sseEmitter = new SseEmitter(getResponse()); //模拟chatgptapi 异步调用返回 new Thread(new Runnable() { public void run() { String[] datas = msg.split(""); for(String data:datas){ //推送 异步子线程里推送数据给客户端 sseEmitter.sendMessage(data); try { Thread.sleep(50); } catch (InterruptedException e) { throw new RuntimeException(e); } } //完成sse 告知主线程已经完成 sseEmitter.complete(); } }).start(); //锁住等待子线程推送完成 sseEmitter.waiting(100); renderNull(); }
JFinal-SSE 视频演示:
JFinal-ChatGpt项目演示:
JBolt极速开发平台,省心,省事儿,极速开发,JFinal社区近1000家企业的选择!
JBolt AI (http://jboltai.com)帮助软件开发团队和企业实现数智化开发转型,应对未来之大变局
咨询可联系
小木微信:18766735632