gpt4 book ai didi

java - 如何使用 Project Reactor 设计/创建 react 方法

转载 作者:行者123 更新时间:2023-12-05 01:15:08 25 4
gpt4 key购买 nike

我刚开始使用基于项目 react 器的响应式框架,例如 spring-webflux,对此我有一些疑问。

问题 1:

示例 1:

  public Mono<String> doSome(String str){
String key = str.substring(0, 5).toLowerCase() + str.substring(6);
return getValueFromRedis(key);
}

public Mono<String> getValueFromRedis(String key){
return reactiveRedisOperations().opsForHash().get("TestCache", key);
}

示例 2:

  public Mono<String> doSome(String str){
return Mono.fromCallable(() -> {
String key = str.substring(0, 5).toLowerCase() + str.substring(6);
return getValueFromRedis(key);
}).flatMap(stringMono -> stringMono);
}

public Mono<String> getValueFromRedis(String key){
return reactiveRedisOperations().opsForHash().get("TestCache", key);
}

两个例子有区别还是两个都可以接受。

问题 2:

示例 1:

  @PostMapping(value = "/greet")
public Mono<String> greet(String name) {
return Mono.fromCallable(() -> aMethod(name));
// or return Mono.just(aMethod(name));
}

public String aMethod(String name){
return "Hello: " + name;
}

示例 2:

  @PostMapping(value = "/greet")
public Mono<String> greet(String name) {
return aMethod(name);
}

public Mono<String> aMethod(String name){
return Mono.just("Hello: " + name);
}

我知道第二个问题很奇怪,但我想知道所有方法都应该返回 Mono 或 Flux 还是我可以像 Question2/Example1 一样使用。

最佳答案

问题1:是的,有区别。在示例 1 中,您在 Mono.fromCallable 之外创建了 String key。这在这里没什么大不了的,但如果它是昂贵的操作,你会减慢一切。

此逻辑 reactiveRedisOperations().opsForHash() 也是从 Mono.fromCallable 中执行的。同样的事情 - 如果这很昂贵,你就会放慢一切。

问题 2:与问题 1 相同。Mono.just 接受常规对象,而不是稍后在需要时调用的对象(如 Callable供应商)。因此,当使用 Mono.just 时,您将立即付出参数初始化的代价。

在你的例子中几乎没有任何区别,但是 MonoFlux 通常用于以异步方式链接昂贵的操作,所以没有什么被阻塞,比如数据库调用或调用其他外部服务。看看我下面的示例,其中 sleep 是对外部调用的模拟。注意打印语句的顺序。

public String superLongMethod() {
System.out.println("superLongMethod");
Thread.sleep(10000);
return "ok";
}

System.out.println("before");
Mono.just(superLongMethod());
System.out.println("after");

// printed output is - before - superLongMethod - after

-----------------------------------------------------------------

System.out.println("before");
Mono.fromCallable(() -> superLongMethod());
System.out.println("after");

// printed output is - before - after - superLongMethod

-----------------------------------------------------------------

System.out.println("before");
String key = superLongMethod();
System.out.println("after");
return getValueFromRedis(key);

// printed output is - before - superLongMethod - after

-----------------------------------------------------------------

System.out.println("before");
Mono<String> mono = Mono.fromCallable(() -> {
String key = superLongMethod();
return getValueFromRedis(key);
}).flatMap(stringMono -> stringMono);
System.out.println("after");
return mono;

// printed output is - before - after - superLongMethod

关于java - 如何使用 Project Reactor 设计/创建 react 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56828329/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com