让我们假设以下两种情况,一个控制器产生一些随机数并带有延迟:
1)反应性Spring5反应性应用:
@GetMapping("/randomNumbers")
public Flux<Double> getReactiveRandomNumbers() {
return generateRandomNumbers(10, 500);
}
/**
* Non-blocking randon number generator
* @param amount - # of numbers to generate
* @param delay - delay between each number generation in milliseconds
* @return
*/
public Flux<Double> generateRandomNumbers(int amount, int delay){
return Flux.range(1, amount)
.delayMillis(delay)
.map(i -> Math.random());
}
2)传统的Spring MVC与DeferredResult
:
@GetMapping("/randomNumbers")
public DeferredResult<Double[]> getReactiveRandomNumbers() {
DeferredResult<Double[]> dr = new DeferredResult<Double[]>();
CompletableFuture.supplyAsync(() -> {
return generateRandomNumbers(10, 500);
}).whenCompleteAsync((p1, p2) -> {
dr.setResult(p1);
});
return dr;
}
/**
* Blocking randon number generator
* @param amount - # of numbers to generate
* @param delay - delay between each number generation in milliseconds
* @return
*/
public Double[] generateRandomNumbers(int amount, int delay){
int generated = 0;
Double [] d = new Double[amount];
while(generated < amount){
try {
Thread.sleep(delay);
} catch (InterruptedException e) {}
d[generated] = Math.random();
generated++;
}
return d;
}
从HTTP客户端(浏览器、AJAX请求)的角度来看,这两种场景之间没有任何区别。我的意思是,客户端将等待所有结果发送,并且在提交整个响应之前不会处理它们。
也就是说,尽管spring web Responsive让我们认为它在生成结果时会将结果发送回去,但实际上情况并非如此,在生成所有数字之前,客户端将无法处理结果。
让客户端完全反应的简单方法是使用WebSocket。
所以,除了一些很酷的东西(比如漂亮的语义、构图…),考虑到浏览器HTTP请求不是被动响应的,并且等同于使用传统的延迟结果,使用Spring Web被动响应有什么意义?
有差异,所以让我试着把它分解。
对于DeferredResult
Spring Web Reactive会从
流量中写入每个单独的值
这更像是一个如何将数据流传输到浏览器的问题?例如,如果添加
“Accept:text/event stream”
作为请求头,则可以在浏览器中将每个double作为单个事件使用。因此,服务器能够做到这一点,并有效地做到这一点。
我试图测试Spring反应式Webclient的默认超时。为此,我创建了一个需要 10 小时才能返回响应的 rest endpoint。 我使用spring-reactive Webclient创建了一个rest客户端。但我看到,springReactiveWebclient一直在等待10个小时。 spring reactive Webclient没有任何默认超时吗?
我试图使用Spring反应式WebClient将文件上传到Spring控制器。控制器非常简单,看起来像这样: 当我使用这个控制器与cURL一切正常 multipartFile转到正确的参数,其他参数进入Map。 当我尝试从WebClient做同样的事情时,我被卡住了。我的代码如下所示: 这会导致400错误 有人知道如何解决这个问题吗?
本文向大家介绍WEB应用从服务器主动推送Data到客户端有哪些方 式?相关面试题,主要包含被问及WEB应用从服务器主动推送Data到客户端有哪些方 式?时的应答技巧和注意事项,需要的朋友参考一下 一般的服务器Push技术包括: 基于AJAX的长轮询(long一polling)方式,服务器Hold—段时间后再返回信息; HTTP Streaming,通过iframe和〈script〉#签完成数据的传
如何将响应从反应型HTTP客户机流式传输到控制器,而不在任何时候将整个响应主体放在应用程序内存中? 几乎所有project reactor客户机的示例都返回。据我所知,反应流是关于流,而不是加载它,然后发送响应。 是否可以返回,以便在不需要使用大量RAM内存来存储中间结果的情况下,将大文件从某个外部服务传输到应用程序客户机?
例如,在本文中,我试图理解为什么在流中使用flatmap()(直接从引用中粘贴副本) AFAIK,应用于流的平面图会为流中的每个输入值产生任意数量的值(0... n)。所以一个平面图需要一个产生流的函数。 通量发射0个或多个项目,然后可选地完成或偏离。 那么,响应流上到底发生了什么?这是接收响应流并发出0个或更多类警报对象的函数吗?因此,如果我们
创建 HTTP 客户端 使用默认选项创建一个HttpClient实例,如下所示: HttpClient client = vertx.createHttpClient(); 如果您想要在创建时配置客户端的选项,如下所示: HttpClientOptions options = new HttpClientOptions().setKeepAlive(false); HttpClient clien