首页 > 解决方案 > Spring Webflux 是否在每个请求的单个线程中调用单个 HandlerFunction?

问题描述

考虑下面的代码片段 - 将简单的非线程安全的 HashMap 传递给SomeHandlerFunction将在其他自动装配的 bean 中使用它的HashMap 是否安全SomeHandlerFunction

@Bean
RouterFunction<ServerResponse> request(SomeHandlerFunction handlerFunction) {
    handlerFunction.setSimpleMapProperties(new HashMap());
    return route(GET("/dummy"), handlerFunction);
}


@Service
class SomeHandlerFunction implements HandlerFunction {
    @Autowired
    List<AnotherBeans> anotherBeans;

    Mono<T> handle(ServerRequest var1) {
        // code...
    }
}

我对 WebFlux 中的多线程模型有点了解,但是这个案例让我感到困惑。

标签: javaspringmultithreadingspring-webfluxreactor

解决方案


如果这HashMap是可变的,那不是一个好主意——即使是 Spring MVC 也不行。你应该怎么做?这实际上取决于手头的用例。

如果您尝试设置本地内存缓存,则可以使用像 Caffeine 这样的库,或者简单地使用ConcurrentMapCache.

如果您想与该 bean 共享配置密钥,您可以使用Collections.unmodifiableMap甚至更好地包装该映射,使其成为适当的不可变 POJO。

如果这是为了携带与正在处理的请求相关联的临时数据,则应改为使用请求属性或 Reactor Context。


推荐阅读