Che*_*rry 2 java spring project-reactor spring-webflux
考虑代码示例:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;
import java.time.Duration;
import static com.google.common.collect.ImmutableMap.of;
@Component
public class Scratch {
@Autowired
private WebClient webClient;
public Mono<MyClass> getMyClass(Long id) {
return webClient.get()
.uri("{id}", of("id", id))
.retrieve()
.bodyToMono(MyClass.class)
.cache(Duration.ofHours(1));
}
}
Run Code Online (Sandbox Code Playgroud)
规格说明:
将保留无限的历史记录,但应用每个项目的到期超时
什么是项目以及缓存什么?
.get().uri()链id = 1任何后续调用都会被缓存吗?或者Mono<MyClass>被缓存。例如,任何后续调用都Mono.map将使用缓存的值?在这两种情况下,什么被视为项目?
Reactor 中的运算符与组件方法上的注释cache之类的东西非常不同。@Cacheable
例如,@Cacheable注释将:
Flux所有 Reactor 运算符都是装饰器,它们返回/的新实例Mono-这就是您需要链接运算符的原因。
让我们看这个例子:
Scratch scratch = //...
Mono<MyClass> myClass = scratch.getMyClass(12L);
Run Code Online (Sandbox Code Playgroud)
这意味着每次有东西订阅该特定Mono实例(所以不是scratch.getMyClass(44L);,也不是另一个调用返回的任何其他实例scratch.getMyClass(12L);),Reactor 将返回第一次使用时缓存的元素。
当 Reactor 谈论元素时,这些元素就是MyClass消息的实例;因为这里,缓存操作符已经被添加到了后面bodyToMono。如果您要将该运算符添加到管道中的其他位置,那就会是一个不同的故事,即它将缓存不同的东西。
现在,此功能不会为所有类似的 HTTP 调用实现 HTTP 客户端缓存。如果应用程序的多个部分需要完全相同的数据,并且您不想浪费资源一遍又一遍地获取相同的数据,则此功能非常有用。
例如,假设此 HTTP 调用成本高昂,并且您希望MyClass在多个位置使用该实例:
Mono<MyClass> myClass = scratch.getMyClass(12L);
Mono<Void> result = saveToDatabase(myClass).then(calculateStats(myClass));
Run Code Online (Sandbox Code Playgroud)
另一个用例是当您想向多个客户端共享数据流时:
@RestController
public class StreamingController {
private Flux<StockQuotes> quotes = quoteService.fetch().cache(Duration.ofSeconds(5));
@GetMapping("/quotes")
public Flux<StockQuotes> streamQuotes() {
return this.quotes;
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,每次新的 HTTP 客户端请求服务器并从中传输数据时,服务器都不会创建到远程股票服务的新连接,并且会重播最后 5 秒的报价(然后继续执行其余)适用于所有新订阅。
| 归档时间: |
|
| 查看次数: |
5526 次 |
| 最近记录: |