1. Overview

In this article, we will see spring web flux framework examples and will cover a little about spring web flux framework use.

2. Spring web flux framework

In the traditional programming model, all services are synchronous and blocking in nature. Reactive programming came into the picture to provide an asynchronous and non-blocking programming model.

Reactive streams are used to achieve asynchronous and non-blocking backpressure. Reactive streams are the standard and specification for Stream-oriented libraries for the JVM. Rxjava, project reactor and more are implementations of the reactive streams API specification.

Spring web flux is a mirror version of spring MVC and it supports fully non-blocking reactive streams. Spring web flux internally uses a project reactor which is one of the implementations of the reactive library.

Spring web flux framework is available from spring 5 and provides reactive programming support for web applications.

Next, we are going to implement non-blocking services by using spring web flux, spring boot, and mango database.

3.Spring web flux example

3.1 Get started

we should add spring-boot-starter-webflux dependency to enable reactive programming in the application and add spring-boot-starter-data-mongodb-reactive dependency to get non-blocking and event-driven features from mongo database side.

To get reactive programming features, everything should be non-blocking in the request like from request making to getting data from the database.

At the time of writing this article, Spring did not provide fully featured connectivity API for reactive relational database integration. If you want more information why it is implemented yet while relational databases are most popular. Go through the following link

reactive-programming-and-relational-databases

In pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb-reactive</artifactId>
</dependency>

3.2 Project Structure

Spring Web Flex Project Structure

3.3 Mono and Flux

Spring web flux internally uses the project reactor library. Mono and Flux are Publisher interface implementations.

Mono represents 0…1 elements
Flux represents 0…N elements

Spring web flux framework provides two types of programming models

1.Annotated controllers
2.Functional Endpoints

In this article, we implemented REST API with annotated controllers and have look at the following controller class

@RestController
public class MarginController {
 
    @Autowired
    private MarginRepository marginRepository;
 
    // create margin
    @PostMapping("/createMargin")
    public Mono<MarginDo> createMargin(@RequestBody MarginDo marginDo) {
        return marginRepository.save(marginDo);
    }
 
    // update margin
    @PostMapping("/updateMargin")
    public void updateMargin(@RequestBody MarginDo marginDo) {
        marginRepository.save(marginDo);
    }
 
    // get margin by customer id
    @GetMapping("/getMargin/{customerId}")
    public Mono<MarginDo> getCustomerMargin(@PathVariable(value = "customerId") String customerId) {
        return marginRepository.findById(customerId);
    }
 
    // get all margins
    @GetMapping("/getAllMargins")
    public Flux<MarginDo> getAllMargins() {
        return marginRepository.findAll();
    }
 
    // delete margin by customer id
    @DeleteMapping("/deleteMargin/{customerId}")
    public void deleteMargin(@PathVariable(value = "customerId") String customerId) {
        marginRepository.deleteById(customerId);
    }
 
    // stream live margins
    @GetMapping(value = "/stream/margins", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<MarginDo> streamAllMargins() {
        return marginRepository.findAll();
    }
 
}

Application.properties file

spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017
spring.data.mongodb.database=test
 
debug=true

Note: while testing method streamAllMargins(), use browser then we can see event-stream output printing in the browser one by one like as in the following image

Spring Web Flex Output

3.4 Mango reactive repository

Use the ReactiveMongoRepository interface to get all basic Dao layer methods that are non-blocking in nature.

public interface MarginRepository extends
 ReactiveMongoRepository<MarginDo, String> { 
}

4. Conclusion

We have explained the spring web flux framework importance with example clearly.

Hope 😊 you like it. if you want more information you can through reference links provided in section 6.

5. Spring Web Flux Framework Source Code

Complete example code is available in the following git repository.

Git Repository link: https://github.com/subhashlamba/spring-examples

6.References

1.spring-framework-reference-web-reactive

2.spring-framework-reference-html-web-reactive

3.reactive-streams-jvm

4.spring-boot

Was this post helpful?

Leave a Reply

Your email address will not be published. Required fields are marked *