我正在尝试使用spring webflux。当我们有WebClient时,我对为什么需要WebSocketClient感到有点困惑。
在春季之前,我们有两个问题
1. REST调用是一个阻塞调用,因为我们使用的是HttpClient。
和
2.每当我们需要数据时,它主要是来自客户端的拉动机制。
但是使用Spring 5和web flux模块,我们可以在服务器端有类似的东西
@Bean
public RouterFunction<ServerResponse> routerFunction () {
return
route(
GET("/streaming"), serverRequest -> {
Flux<Integer> flow = Flux.just(1, 2, 3, 4, 5).delayElements(Duration.ofSeconds(2)).doOnEach(entry -> System.out.println(entry.get()));
return ServerResponse.ok().contentType(MediaType.APPLICATION_STREAM_JSON).body(BodyInserters.fromPublisher(flow, Integer.class));
}
)
;
}
我们可以使用客户端的WebClient来解决上面提到的两个问题
WebClient.create("http://localhost:8080")
.get()
.uri("/streaming")
.accept(MediaType.APPLICATION_STREAM_JSON)
.exchange()
.flatMap(response -> response.bodyToMono(String.class))
.subscribe(System.out::println);
IntStream.range(0,10).forEach(i -> {
try {
Thread.sleep(2000);
System.out.println("non blocking");
} catch (InterruptedException e) {
e.printStackTrace();
}
});
在这种情况下,首先,REST调用是非阻塞的,可以通过立即执行下一个语句来验证。而且数据也是从服务器端推出的,而不是从客户端提取的。
因此,如果我们可以使用WebClient执行此操作,那么我需要WebSocketClient。
答案 0 :(得分:2)
WebSocketClient
相比, WebClient
有两个主要差异
它不提供被动但是异步API
它在较低的抽象级别上运行,对连接关闭等事情作出反应。
它使用双向的WebSockets。
WebSocketClient
的用例是:
你想要双向通信而不是请求/响应(响应可能很大并且一点一点地到达。
您想对低级协议事件做出反应
您不想依赖Project Reactor