@org.springframework.web.bind.annotation.RestController
public class RestController {
@Autowired
NoteDao noteDao;
/* non-reactive */
@RequestMapping("/hello")
public String sayHello(){
return "Hello pal";
}
/* reactive */
@RequestMapping("/hello/reactive")
public Mono<String> sayHelloReactively(){
return Mono.just("Hello reactively, pal!");
}
/* non-reactive */
@RequestMapping("/notes")
public List<Note> getAllNotes(){
return noteDao.findAll();
}
/* reactive */
@RequestMapping("/notes/reactive")
public Flux<List<Note>> getAllNotesReactively(){
return Flux.just(noteDao.findAll());
}
}
sayHello
和sayHelloReactivity
都可以被认为是反应式的-您基本上是从内存中返回一些东西,不涉及I/O。第二个方法无缘无故地包装字符串值--这两个方法是等效的。
reactive背后的核心思想是,对于涉及I/O操作的所有操作(例如,从网络上读写),代码不应该在等待结果(REST调用、数据库查询)返回时无所事事。您可以将其视为回调,加上许多附加功能,如反压。
因为noteDAO
公开同步+阻塞方法,所以不能调用一个方法并在结果出来后立即得到通知。用flux.just
包装阻塞调用只会使事情变得更糟。在WebFlux应用程序中,只有很少的线程--如果这样做,每个调用都会阻塞一个线程--那么很容易使应用程序完全崩溃。