solon-web-sse
此插件,由社区成员(孔皮皮)贡献
<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) { //return 之后才开始初始化。//初始化后,才能使用
//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";
}
}