9

我正在尝试将Reactor 2x集成到现有Spring 4应用程序中,以在执行REST请求期间提高性能,其中resources可以相互独立地获取,类似于 map-reduce,我们将作业并行化为多个线程,然后将它们加入缓冲区.

到目前为止,我们有这个示例在非弹簧环境中工作:

    //Ordered resources to apply transformations.
    List<Map<String, Object>> result;

    result = Streams.from(resources)
                    .flatMap(m -> Streams.just(m) .dispatchOn(Environment.cachedDispatcher())
                    .map(resourceToMapFunction::apply))
                    .buffer().next().await(5, TimeUnit.SECONDS);

在上面的示例中,我们使用 应用转换resourceToMapFunction,然后使用buffer()方法连接 ,创建Promise等待结果并返回result.

我的第一个问题,这是应该使用 Reactor 的方式吗?我知道这些转换是正确应用的,但也许,我是一个新手,Reactor没有以正确的方式使用某些东西。

我的第二个问题,没什么大不了的,但是Reactor项目中是否有任何东西可以按照输入中提供的相同顺序返回resources?由于这是在多个线程中执行的,所以我很确定答案不是,就像我说的那样,我的担心更少,但无论如何都想问。

最后一个问题,当我将此代码引入我的Spring项目时,转换失败,因为Bean应用底层转换的依赖项不在执行线程中,这是我可以使用 Spring Reactor 版本轻松完成的事情吗?如果是这样,是否有任何链接或文档显示如何操作?

非常感谢!

何塞·路易斯

4

2 回答 2

0

React 库将有很大帮助。Spring 5 支持响应式编程(和异步 servlet),而不是 Spring 4。

Spring 4 仍然支持一些基本的异步特性。对于您的情况,它必须足够。这是一个基于@EnableAsyncand的小例子CompletableFuture

https://dzone.com/articles/multi-threading-in-spring-boot-using-completablefu

于 2021-10-03T12:06:04.753 回答
0

您应该使用 Reactor 的 API。Stream因此,您应该创建 Reactor ,而不是创建 Java Flux。然后你应该使用flatMapa 的函数Flux来获取一些资源。如果您希望资源与请求的顺序相同,您可以使用flatMapSequential.

所以代码看起来像:

        Flux<Map<String,Object>> result = Flux.fromIterable(resources)
                .flatMapSequential(resourceToMapFunction::apply)
                .take(Duration.ofSeconds(5));

然后你有一个 Reactor 流,你可以对该流应用更多操作。如果您想要简单的列表,那么您必须使用 operator 来阻止collectList。如果您想控制将在其上执行给定函数的线程,那么您必须熟悉Scheduler.

于 2021-10-03T11:23:28.313 回答