【教程】JFinal中SseEmitter用法

JFinal里的SseEmitter有两种场景使用方式

都是在Controller里,因为SSE基于http。

一、主线程里推送数据到客户端

xxxxxxxxxxxxxx.jpg


/**
 * 主线程里
 * 测试本地发送文本打字机
 */
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();
}


二、子线程里异步处理资源数据准备然后异步推送

这种情况需要主线程等待子线程完成。

haha2004.jpg

/**
 * 异步子线程模拟
 * 测试本地发送文本打字机
 */
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+SSE+openAI实现完整ChatGPT

JFinal-ChatGpt项目演示:

【新】JFinal-ChatGPT项目进展和案例



JBolt极速开发平台,省心,省事儿,极速开发,JFinal社区近1000家企业的选择!

JBolt AI (http://jboltai.com)帮助软件开发团队和企业实现数智化开发转型,应对未来之大变局


咨询可联系

小木微信:18766735632

评论区

zzutligang

2024-10-22 16:27

@山东小木 SseEmitter这个类里的waiting方法最后一行有一句System.out.println("Waiting finished");能不能下次更新发布jfinal的时候,把这句代码注释掉?

山东小木

2024-10-24 00:26

@zzutligang 已处理提交PR 看PR

zzutligang

2024-10-24 09:51

热门分享

扫码入社