Spring Webflux是否在每个请求的单个线程中调用单个HandlerFunction?

时间:2018-11-04 21:18:53

标签: java spring multithreading spring-webflux reactor

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

@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中的多线程模型有所了解,但是这种情况使我感到困惑。

1 个答案:

答案 0 :(得分:1)

如果HashMap是可变的,则不是个好主意-即使使用Spring MVC也是如此。 您应该怎么做呢?这实际上取决于手头的用例。

如果您要设置本地内存缓存,则可以使用Caffeine之类的库,也可以仅使用ConcurrentMapCache

如果您希望与该bean共享配置密钥,则可以使用Collections.unmodifiableMap甚至更好的方法包装该映射,并使其成为正确的不可变POJO。

如果这是为了携带与正在处理的请求链接的临时数据,则应该使用请求属性或Reactor上下文。