Solon

solon.web.sse

v2.7.1 native </> markdown

此插件,由社区成员(孔皮皮)贡献

<dependency>
    <groupId>org.noear</groupId>
    <artifactId>solon.web.sse</artifactId>
</dependency>

1、描述

基础扩展插件,为 Solon Web 提供 SSE (Server-Sent Events) 协议支持。v2.3.6 后支持

  • 这个插件可能需要把线程数调大:
#服务 http 最小线程数(默认:0表示自动,支持固定值 2 或 内核倍数 x2)
server.http.coreThreads: 0 
#服务 http 最大线程数(默认:0表示自动,支持固定值 32 或 内核倍数 x32)
server.http.maxThreads: 0

更多配置可参考:《应用常用配置说明》

  • 关于超时的说明

超时是指服务端的异步超时,默认为 30000L(即30秒)。其中,0L 代表默认,-1L代表不超时。

  • 提示

开发时,要用于后端超时和前端重连时间,以及线程数配置。

2、代码应用

@Controller
public class SseDemoController {
    static Map<String, SseEmitter> emitterMap = new HashMap<>();

    @Mapping("/sse/{id}")
    public SseEmitter sse(String id) {
         //3000L 是后端异步超时
         return new SseEmitter(3000L)
                .onCompletion(() -> emitterMap.remove(id))
                .onError(e -> e.printStackTrace())
                .onInited(s -> emitterMap.put(id, s)); //在 onInited 事件时,可以直接发消息(初始化完成之前,是不能发消息的)
    }

    @Mapping("/sse/put/{id}")
    public String ssePut(String id) {
        SseEmitter emitter = emitterMap.get(id);
        if (emitter == null) {
            return "No user: " + id;
        }

        String msg = "test msg -> " + System.currentTimeMillis();
        System.out.println(msg);
        emitter.send(msg);
        //reconnectTime 用于提示前端重连时间
        emitter.send(new SseEvent().id(Utils.guid()).data(msg).reconnectTime(1000L));
        emitter.send(ONode.stringify(Result.succeed(msg)));

        return "Ok";
    }

    @Mapping("/sse/del/{id}")
    public String sseDel(String id) {
        SseEmitter emitter = emitterMap.get(id);
        if (emitter != null) {
            emitter.complete();
        }

        return "Ok";
    }
}