spring-webflux 相关问题

Spring Framework 5包含一个新的spring-webflux模块。该模块包含对被动HTTP和WebSocket客户端以及被动服务器Web应用程序的支持,包括REST,HTML浏览器和WebSocket样式交互.WebFlux可以在Servlet容器上运行,支持Servlet 3.1非阻塞IO API以及其他异步运行时,如Netty和Undertow。

在 Spring MVC 应用程序中提供 Flux 端点(PDF 下载)

我有一个 Spring Boot 3.1 MVC 应用程序 (Tomcat),我需要在其中添加一个返回 PDF 的端点。该 PDF 本身是从内部 HTTP 服务器获取的。我必须阅读的 PDF 的 URL...

回答 2 投票 0

lambda 表达式中的返回类型错误:Mono<User> 无法转换为 Mono<UserDetails>

为什么会这样 @豆 公共 ReactiveUserDetailsService userDetailsService() { 返回用户名 -> { Mono userDetailsMono = Mono.justOrEmpty(

回答 1 投票 0

在 Spring Security 反应运行时以编程方式选择 Oauth2 身份提供者

我有一个反应式 Spring Boot 2 应用程序,它充当使用 Spring Security 启动用户身份验证的 Web 代理。访问此应用程序的最终用户来自公众或

回答 1 投票 0

Webclient SslHandshakeTimeoutException:10000ms 后握手超时

我最近使用 webflux 和 webclient 制作了一个组件。 有一些请求使用外部资源来检索某些数据。 在本地工作一切正常,从

回答 1 投票 0

Project Reactor 中的默认调度程序是什么?

Project Reactor 中是否有“默认”调度程序?哪一个?我所说的“默认”是指当链没有调用 subscribeOn() 或publishOn() 时使用的默认值。

回答 2 投票 0

Spring WebClient 错误 - Reactor.core.publisher.LambdaMonoSubscriber 无法转换为类 org.springframework.web.client.RestClient

以下是我实现的rest服务 RestClient.RequestHeadersSpec 规格 = (RestClient.RequestHeadersSpec) webClient 。邮政() .uri(&...

回答 1 投票 0

在 Reactor switchIfEmpty 上抛出异常之前从数据库读取消息

我们正在使用 webflux,当找不到对象时我需要抛出错误。 我们有一个错误代码 ENTITY_NOT_FOUND,我们需要抛出一个 MyException() 以及错误代码的消息,那......

回答 1 投票 0

[SpringCloudGateway]:端点重定向超时后不执行后置过滤器

我们在 Spring Cloud Gateway 应用程序中实现了几个自定义的有序全局前置和后置过滤器。这些预全局过滤器将在重定向之前针对任何传入请求执行...

回答 1 投票 0

WebClient 在 Stream 中的每个元素调用上打开和关闭连接

尝试了解 spring webclient 如何处理对等点之间的连接。 使用以下代码时: 我与流中的元素有尽可能多的密切联系。 我正期待着...

回答 1 投票 0

Webflux - Spring Boot - 支持 http 代理的 oAuth2 客户端

我正在努力在代理后面使用 oauth2 正确设置 webflux-weblient 。 看来, ServerOAuth2AuthorizedClientExchangeFilterFunction 使用了 webclient 的新实例,

回答 2 投票 0

虚拟线程不适用于 Spring Boot WebFlux 中的 POST 请求

我在为 POST 请求启用虚拟线程时遇到问题。我使用 Spring Boot WebFlux v.3.2.2。我的 pom.xml: 我在为 POST 请求启用虚拟线程时遇到问题。我使用 Spring Boot WebFlux v.3.2.2。我的 pom.xml: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.2.2</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.apricoz</groupId> <artifactId>Virtual-Threads</artifactId> <version>0.0.1-SNAPSHOT</version> <name>Virtual-Threads</name> <properties> <java.version>21</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build> </project> 我在 application.properties 文件中启用了虚拟线程,使用 spring.threads.virtual.enabled=true。 我创建了一个测试 RestController: @RestController @RequestMapping @Slf4j public class TestController { @GetMapping public String getHello() { log.info("{}", Thread.currentThread()); return "Hello World!"; } @PostMapping public String getHello(@RequestBody String name) { log.info("{}", Thread.currentThread()); return String.format("Hello %s!", name); } } 因此,当执行 GET 请求时,我在控制台中看到 VirtualThread[#57,task-1]/runnable@ForkJoinPool-1-worker-1,而当执行 POST 请求时,我看到 Thread[#56,reactor-http-nio-2,5,main]。如何为 POST 请求启用虚拟线程? 每个类似 @RequestMapping 注释的方法都会出现该问题,该方法接受一个用 @RequestBody 注释的参数。在这种情况下,该方法不会在 WebFlux 的 ExecutorScheduler/TaskExecutor 托管线程 (task-<N>) 上执行,而是在 WebFlux 事件循环 (reactor-http-nio-<N>) 上执行。 因此,这个问题并不特定于虚拟线程,显然它出现在平台线程中,如果平台TaskExecutor,例如ThreadPoolTaskExecutor,配置为运行控制器的方法。相反,这个问题特定于 Spring-WebFlux 桥与 WebFlux 本身的交互,可能是 Mono 子类的复杂层次结构(GET 请求落在 Just 上,带有主体的请求 - 位于其他东西上)。这个桥,WebFluxConfigurationSupport,将所谓的阻塞执行器设置为RequestMappingHandlerAdapter,负责调用控制器的方法。 事实上,这样的配置是 Spring Web-Flux 集成的最新介绍。 Rossen Stoyanchev 在 2023 年 6 月 15 日的文章阻止 WebFlux 控制器方法的执行中写道: 我们可以通过阻止执行的选项来增强 WebFuxConfigurer,例如配置 AsyncTaskExecutor,例如新的 VirtualThreadTaskExecutor。 因此,如果我们使用 Spring Boot 2.5.0 版本(它带来了 WebFlux 3.4.6),那么我们可以看到,即使是 GET 请求也不是在执行器上执行,而是在 WebFlux 事件循环上执行。因此,这种思想对于 Spring WebFlux 来说相对较新,我们可能期望对其进行进一步改进,同时将这种情况报告为错误。 与此同时,作为临时解决方法,我可以提供简单且批发的(дубовoe)解决方案,该解决方案仍然允许在执行程序管理的线程上运行有问题的方法。 AOP 方面拦截对这些方法的所有调用,并在其管理的线程上调用它们。 import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.task.AsyncTaskExecutor; import org.springframework.stereotype.Component; @Component @Aspect public class ManagedThreadAspect { private static class Worker implements Runnable { private final ProceedingJoinPoint pjp; private volatile Object result; private volatile Throwable exception; public Worker(final ProceedingJoinPoint pjp) { this.pjp = pjp; } @Override public void run() { try { result = pjp.proceed(); } catch (Throwable e) { exception = e; } } public Object getResult() throws Throwable { if (exception != null) throw exception; return result; } } @Around("execution(* *(.., @org.springframework.web.bind.annotation.RequestBody (*), ..))") public Object invokeOnManagedThread(final ProceedingJoinPoint pjp) throws Throwable { final Worker worker = new Worker(pjp); // this is nothing more than a result holder Thread.ofVirtual().start( () -> { worker.run(); }).join(); return worker.getResult(); } } 或者,如果您想重用库存执行器,并因此使用 spring.threads.virtual.enabled=true 设置,则注入执行器并调用它: @Autowired private AsyncTaskExecutor taskExecutor; ... final Worker worker = new Worker(pjp); taskExecutor.submit(worker).get(); return worker.getResult(); 效果与 WebFlux 管理的执行器调用此方法大致相同:@RequestBody 方法将在虚拟(或者通常是 Aspect 管理)线程上调用。 Spring AOP应该适当配置,例如其中一个 @Configuration 类应使用 @EnableAspectJAutoProxy(proxyTargetClass=true) 进行注释。 如果上述方法对你有用,我可以在 github 上发布一个示例,或者向你做一个 PR。 然而,从概念上讲,在 WebFlux 中使用虚拟线程会引发一些问题。 WebFlux 的关键思想是在其事件循环中“非阻塞”处理请求,而虚拟线程本质上带来的是“阻塞”。因此,WebFlux 和虚拟线程即使不是相互排斥的,也被许多人视为并发方法。例如,Baldun 博客的作者,其标题为“Reactor WebFlux vs Virtual Threads”,得出的结论是: 我们比较了两种不同的并发和异步处理方法。 当然,这并不意味着虚拟线程在 WebFlux 中应该被视为无稽之谈,只有运行现实世界的 Web 应用程序才能揭示这种架构的优缺点。

回答 1 投票 0

通过Webflux发送SSE事件时检测到客户端离线

将 Spring Webflux 与 Netty 结合使用,下面的代码每 5 秒向连接到该 SSE 端点的任何客户端发送一次心跳。 @RestController @RequestMapping(值=“/”) 公开课S...

回答 1 投票 0

由于相同的bean,应用程序无法启动

我有一个 Spring Webflux 应用程序,我试图从旧模块加载依赖项(旧模块位于 Spring WebMVC 框架上)。 当应用程序启动时,抛出此错误 - ...

回答 4 投票 0

使用 webflux bean 验证时出现不明确的异常(WebExchangeBindException 与 ConstraintViolationException)

我正在使用 Webflux,并将使用 bean 验证进行现场验证。 尝试使用 @RestControllerAdvice 响应字段错误 在 bean 验证字段中指定组时...

回答 2 投票 0

Spring WebFlux简单应用程序无法使用JSON响应[已关闭]

我有一个简单的 Spring Web 应用程序,我尝试返回 JSON 作为响应,但我不知道为什么以及如何返回 JSON 输出。我在这里做错了什么? 包 com.restservice.restservice; 重要...

回答 1 投票 0

如何在 Spring Security Webflux 中自定义默认的未授权响应正文?

我正在使用 Spring boot Webflux 启动一个新项目,但现在我不知道如何处理 401 响应。 我想返回带有响应代码的消息正文。响应代码正常并且

回答 2 投票 0

Mono<Void>.flatMap 返回 Mono 时不会被调用<Something>

我是 WebFlux 的新手。开发文件上传API。我想将上传的文件和元保存到数据库并返回保存的实体作为响应。

回答 1 投票 0

取消信号(关闭连接)可能是什么原因?

在我们应用程序的 Kibana 中,我不断看到来自 org.springframework.web.reactive.function.client.ExchangeFunctions 的这行日志: [2f5e234b] 取消信号(关闭连接) 线程是 r...

回答 1 投票 0

不支持 spring boot webclient 阻塞

以下功能: 公共 ScoringResponse 搜索(SearchRequest searchRequest){ 返回 webClient.post() .bodyValue(搜索请求) 。取回() .onStatus(

回答 1 投票 0

Spring Webflux:在WebFilter中写入响应正文

我正在尝试编写一个WebFilter,它对http请求进行一些检查。如果检查失败,我想返回 http 错误 400,并以错误消息作为响应正文。 我有这个代码: @Orde...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.