package luck.spring.boot.webflux;
import org.springframework.http.MediaType;
import org.springframework.http.codec.ServerSentEvent;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.reactive.result.view.Rendering;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.time.Duration;
@RestController
public class LuckRestController {
@GetMapping("/e")
public Mono<String> e(@RequestParam(value = "id", defaultValue = "0") Long id) {
return Mono.just("hello" + 10 / id);
}
@GetMapping("/a")
public Mono<String> a(Long userId) {
return Mono.just("a:" + userId);
}
@GetMapping("/b")
public Flux<String> b(Long userId) {
return Flux.just("b:" + userId);
}
@GetMapping("/f")
public Flux<Person> f() {
return Flux.just(new Person(1, "luck"));
}
@GetMapping("/c")
public String c(Long userId) {
return "c:" + userId;
}
// 启用SSE,规定当前请求服务器要生产的数据类型为event-stream
// 也就是会在响应头中添加Content-Type:text/event-stream;charset=UTF-8
@GetMapping(value = "/sse", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> sse() {
return Flux.range(1, 100)
.map(i -> "luck->" + i)
.delayElements(Duration.ofMillis(600));
}
// 返回的是SSE的完整数据
@GetMapping(value = "/sse1", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<ServerSentEvent<String>> sse1() {
return Flux.range(1, 100)
.map(i ->
// 构建一个SSE对象
ServerSentEvent.<String>builder()
.id("id")
.data("luck->" + i)
.comment("comment")
.event("event")
// .retry(Duration.ofSeconds(1))
.build()
)
.delayElements(Duration.ofMillis(600));
}
@GetMapping("/baidu")
public Rendering rendering() {
return Rendering.redirectTo("http://luck-anti.top/").build();
}
// webmvc的sse
// @GetMapping("/sse/a", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
// public SseEmitter sseEmitter() {
// SseEmitter emitter = new SseEmitter();
// // 启动一个新的线程生成事件
// new Thread(() -> {
// try {
// for (int i = 0; i < 10; i++) {
// // 发送事件到客户端
// emitter.send(SseEmitter.event().data("Event " + i));
// // 模拟事件之间的延迟
// Thread.sleep(1000);
// }
// // 发送完成信号
// emitter.complete();
// } catch (Exception e) {
// emitter.completeWithError(e);
// }
// }).start();
// return emitter;
// }
}
01-22
3054