SpringWebFlux中使用与SpringMVC一样的Api接口处理方式

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
Spring Boot 中集成 WebFlux 并结合 Spring MVC 的异步响应 WebClient 实现 Server-Sent Events (SSE),可以通过以下步骤完成。SSE 是一种允许服务器向客户端推送实时更新的技术。 ### 1. 添加依赖 首先,在 `pom.xml` 中添加 WebFlux 和 WebClient 所需的依赖: ```xml <dependencies> <!-- Spring WebFlux --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency> <!-- Spring MVC --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> ``` ### 2. 配置 WebClient 你可以创建一个 WebClient Bean 来调用外部服务并接收 SSE 数据流: ```java import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.reactive.function.client.WebClient; @Configuration public class WebClientConfig { @Bean public WebClient webClient() { return WebClient.builder() .baseUrl("http://example.com/sse") // 替换为实际的 SSE 接口地址 .build(); } } ``` ### 3. 创建 SseController 使用 Spring MVC 的 `ResponseBodyEmitter` 实现异步响应,并通过 WebClient 获取 SSE 数据流: ```java import org.springframework.beans.factory.annotation.Autowired; 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.reactive.function.client.WebClient; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; import java.io.IOException; import java.time.Duration; @RestController @RequestMapping("/api/sse") public class SseController { @Autowired private WebClient webClient; @GetMapping(produces = MediaType.TEXT_EVENT_STREAM_VALUE) public SseEmitter streamEvents() { SseEmitter emitter = new SseEmitter(60_000L); // 设置超时时间为60秒 webClient.get() .retrieve() .bodyToFlux(String.class) .doOnNext(event -> { try { emitter.send(event); } catch (IOException e) { emitter.complete(); } }) .doOnError(emitter::completeWithError) .doOnComplete(emitter::complete) .subscribe(); return emitter; } } ``` ### 4. 启动类 确保你的 Spring Boot 启动类正确扫描到所有组件: ```java import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` ### 5. 测试接口 启动应用后,访问 `/api/sse` 接口,浏览器或客户端将接收到从外部服务通过 WebClient 获取的 SSE 数据流。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值