【问题标题】:post processing in spring boot webfluxspring boot webflux中的后期处理
【发布时间】:2020-10-02 08:06:09
【问题描述】:

我在 restcontroller 中有一个方法。我需要在方法执行完全完成后将输入请求转换为字符串并发送到另一个目的地,理想情况下我不应该影响方法处理执行,方法应该在没有额外延迟的情况下执行。 在非 webflux 应用程序中,我可以在 HandlerIntercepter 中使用 afterCompletion。但由于使用了 WebFlux,我无法使用它。 控制器方法执行结束并返回给调用者响应后如何进行额外处理?

【问题讨论】:

    标签: spring-boot spring-webflux


    【解决方案1】:

    如果您要调用的逻辑特定于这一控制器,您可以使用doFinally。它在您的 Stream (Mono/Flux) 终止后执行。 https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Flux.html#doFinally-java.util.function.Consumer-

    例子:

    public class Playground {
    
        ConverterService converterService;
        PostProcessor postProcessor;
    
        public Playground(ConverterService converterService, PostProcessor postProcessor) {
            this.converterService = converterService;
            this.postProcessor = postProcessor;
        }
    
        public Mono<String> endpoint(Integer input) {
            return Mono.just(input)
                    .flatMap(integer -> converterService.convert(integer))
                    .doFinally(signalType -> postProcess(input));
        }
    
        private void postProcess(Integer input) {
            this.postProcessor.process(input);
        }
    
    }
    

    首先调用converterService。流终止后,无论如何都会调用postProcessor

    【讨论】:

    • 谢谢。我已经测试过了。但是这个解决方案会阻止控制器的响应。例如,如果我在 postProcess 方法中调用 Thread.sleep(5000) 那么它将影响控制器响应,服务将以这种方式在 +5 秒内响应。理想情况下,我需要非阻塞解决方案。
    • 是否有可能同时添加了 spring-boot-starter-web 和 spring-boot-starter-webflux 作为依赖项?当你启动你的服务器时,它使用的是 Netty 还是 Tomcat?
    • 不,只有 spring-boot-starter-webflux。它使用 Netty。
    • 另外,我尝试实现 WebFilter,并且在 doFinallly 中我得到了预期的非阻塞结果。但是在 doFinally 的 WebFilter 中,我没有成功捕获请求
    猜你喜欢
    • 2021-07-16
    • 2020-02-09
    • 1970-01-01
    • 2021-11-12
    • 2019-11-08
    • 2018-08-18
    • 2021-12-29
    • 2020-03-23
    • 2020-01-20
    相关资源
    最近更新 更多