Just to quickly recap, my objective was to develop a reactive service which takes in a request which looks like this:
{ "id":1, "delay_by": 2000, "payload": "Hello", "throw_exception": false }
and returns a response along these lines:
{ "id": "1", "received": "Hello", "payload": "Response Message" }
I had demonstrated this in two ways that the upcoming Spring's reactive model supports, using the Reactor-Core Flux type as a return type and using Rx-java Observable type
However the catch with these types is that the response would look something like this:
[{"id":"1","received":"Hello","payload":"From RxJavaService"}]
Essentially an array, and the reason is obvious - Flux and Observable represent zero or more asynchronous emissions and so Spring Reactive Web framework has to represent such a result as an array.
The fix to return the expected json is to essentially return a type which represents 1 value - such a type is the Mono in Reactor-Core OR a Single in Rx-java. Both these types are as capable as their multi-valued counterparts in providing functions which combine, transform their elements.
So with this change the controller signature with Mono looks like this:
@RequestMapping(path = "/handleMessageReactor", method = RequestMethod.POST) public Mono<MessageAcknowledgement> handleMessage(@RequestBody Message message) { return this.aService.handleMessageMono(message); }
and with Single like this:
@RequestMapping(path = "/handleMessageRxJava", method = RequestMethod.POST) public Single<MessageAcknowledgement> handleMessage(@RequestBody Message message) { return this.aService.handleMessageSingle(message); }
I have the sample code available in my github repo
No comments:
Post a Comment