9. UNDER THE HOOD
Thread
HTTP
Request
Thread
HTTP
Request
100
. . .
@GetMapping("/person")
List<Person> get(){
List<Person> result =
db.longOperation();
return
Response.ok(result);
}
HTTP
HTTP
HTTPHTTP
HTTP
< 100
@GetMapping("/person")
public Flux<Person> all(){
return Flux.fromStream( personRepository.all() );
}
10. COMMON INTERVIEW MISTAKE
• ASYNC REQUEST AS AN ANSWER FOR LONG
REQUESTS (WRONG)
JavaScript queries
process
Long Running
server
Display results
• PULLING OR PUSHING (RIGHT)
Client query
Pull status of Job
Display Result
Server
Render Job ID
Track Status of Job
11. DO IT IN REACTIVE WAY
@RequestMapping(value = "/report/{userId}", method = RequestMethod.PUT)
@ResponseStatus(HttpStatus.OK)
public void longReport(@PathVariable String userId){
Mono.just(userId)
.subscribeOn(Schedulers.parallel()) // MOST IMPORTANT LINE
.log()
.subscribe(
personRepository::longOperation,
websocketRegistry::notifyError, //use WebSockets to report error
websocketRegistry::notifySuccess //use WebSockets to report success
);
;
//here we return to client status OK
}
12. {FINALIZE}
• REACTIVE REVOLUTIONIZE MULTITHREADING BY
EXPOSING GOOD DESIGN PATTERNS;
• SPRING PUTS ALL TOGETHER;
• CHANGE YOUR MIND TO BE REACTIVE.
• ANY QUESTIONS?