import cn.hutool.core.util.RandomUtil;
import com.alibaba.fastjson.JSONObject;
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArrayList;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
@RestController
@RequestMapping("/sse")
public class SseApi {
private final CopyOnWriteArrayList<SseEmitter> emitters = new CopyOnWriteArrayList<>();
@GetMapping("/connect")
public SseEmitter connect() {
SseEmitter emitter = new SseEmitter(30000L);
// 添加新的Emitter到列表中
emitters.add(emitter);
// 设置断开连接时的回调
emitter.onCompletion(() -> emitters.remove(emitter));
emitter.onTimeout(() -> emitters.remove(emitter));
return emitter;
}
@GetMapping("/send")
public void send(String message) {
// 发送消息给所有连接的客户端
emitters.forEach(emitter -> {
try {
for (int i = 0; i < 10; i++) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("randomNumber", RandomUtil.randomInt(100));
emitter.send(jsonObject.toJSONString(),
MediaType.APPLICATION_JSON);
}
} catch (IOException e) {
emitter.complete();
emitters.remove(emitter);
e.printStackTrace();
}
});
}
}
http://localhost/sse/connect
http://localhost/sse/send?message=123