探究WebClient的block和subscribe call有無return的服務的差別
Java代碼
Server
Server1
@RequestMapping("/server1")
public void server1(){
for (int i = 0; i < 5; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.info("server1 is executing");
}
log.info("server1 is done");
}
Server2
@RequestMapping("/server2")
public String server2(){
for (int i = 0; i < 5; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.info("server2 is executing");
}
log.info("server2 is done");
return "server2's return";
}
Client
client1
@RequestMapping("/client1")
public void client1() {
log.info("block call 無return");
Void block = webClient.get().uri("/server1").retrieve().bodyToMono(Void.class).block();
log.info("client1 finished");
}
client2
@RequestMapping("/client2")
public void client2() {
log.info("block call 有return");
String block = webClient.get().uri("/server2").retrieve().bodyToMono(String.class).block();
log.info("client2 finished");
}
client3
@RequestMapping("/client3")
public void client3() {
log.info("subscribe call 無return");
Disposable subscribe = webClient.get().uri("/server1").retrieve().bodyToMono(Void.class).subscribe();
log.info("client3 finished");
}
client4
@RequestMapping("/client4")
public void client4() {
log.info("subscribe call 有return");
Disposable subscribe = webClient.get().uri("/server2").retrieve().bodyToMono(String.class).subscribe();
log.info("client4 finished");
}
控制台輸出
Block call 無return
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLygDN5QDN1QTM1AzNwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
Block call 有return
Subscribe call 無return
Subscribe call 有return
結論
Block同步,subscribe異步。與call的服務有沒有return無關