<mark>此插件，主要社区贡献人（孔皮皮）</mark>


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

### 1、描述

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

* 这个插件可能需要把线程数调大：

```yaml
#服务 http 最小线程数（默认：0表示自动，支持固定值 2 或 内核倍数 x2）
server.http.coreThreads: 0 
#服务 http 最大线程数（默认：0表示自动，支持固定值 32 或 内核倍数 x32）
server.http.maxThreads: 0
```

更多配置可参考：[《应用常用配置说明》](/article/174)


* 关于超时的说明

超时是指服务端的异步超时，默认为 30000L（即30秒）。其中，0L 代表默认，-1L代表不超时（仍有闲置超时限制）。

* 提示

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


### 2、代码应用


推送模式

```java
@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";
    }
}
```

流式输出模式

```java
@Controller
public class SseDemoController {
    @Produces(MimeType.TEXT_EVENT_STREAM_UTF8_VALUE)
    @Mapping("case1")
    public Flux<SseEvent> case1() {
         return Flux.just(new SseEvent().data("test"));
    }
}

//此模式，常用于 ai 应用开发

@Controller
public class DemoController {
    @Inject
    ChatModel chatModel;

    @Produces(MimeType.TEXT_EVENT_STREAM_UTF8_VALUE)
    @Mapping("case2")
    public Flux<ChatMessage> case2(String prompt) throws IOException {
        return Flux.from(chatModel.prompt(prompt).stream())
                .filter(resp -> resp.haContent())
                .map(resp -> resp.getMessage());
    }
}
```

