美文网首页Spring Boot程序员技术栈Spring-Boot
Spring Boot实战-使用WebFlux进行响应式编程(2

Spring Boot实战-使用WebFlux进行响应式编程(2

作者: 我的小熊不见了 | 来源:发表于2019-02-20 09:45 被阅读6次

    响应式编程范式为开发高性能 Web 应用带来了新的机会和挑战。Spring 5 中的 WebFlux 模块可以作为开发响应式 Web 应用的基础。由于 Spring 框架的流行,WebFlux 会成为开发 Web 应用的重要趋势之一。

    在上一节中我们对WebFlux进行了介绍并且使用WebFlux开发了一个极其简单的接口,接下来展示更多关于WebFlux 的用法

    • 新建一个UserController.java
    @RestController
    @RequestMapping("/user")
    public class UserController {
    
        private final UserService userService;
    
        @Autowired
        public UserController(final UserService userService) {
            this.userService = userService;
        }
    
        @ResponseStatus(value = HttpStatus.NOT_FOUND, reason = "Resource not found")
        @ExceptionHandler(ResourceNotFoundException.class)
        public void notFound() {
        }
    
        @GetMapping("")
        public Flux<User> list() {
            return this.userService.list();
        }
    
        @GetMapping("/{id}")
        public Mono<User> getById(@PathVariable("id") final String id) {
            return this.userService.getById(id);
        }
    
        @PostMapping("")
        public Mono<User> create(@RequestBody final User user) {
            return this.userService.createOrUpdate(user);
        }
    
        @PutMapping("/{id}")
        public Mono<User>  update(@PathVariable("id") final String id, @RequestBody final User user) {
            Objects.requireNonNull(user);
            user.setId(id);
            return this.userService.createOrUpdate(user);
        }
    
        @DeleteMapping("/{id}")
        public Mono<User>  delete(@PathVariable("id") final String id) {
            return this.userService.delete(id);
        }
    }
    
    • 新建UserService.java
    @Service
    public class UserService {
        private final Map<String, User> data = new ConcurrentHashMap<>();
    
        public Flux<User> list() {
            return Flux.fromIterable(this.data.values());
        }
    
        public Flux<User> getById(final Flux<String> ids) {
            return ids.flatMap(id -> Mono.justOrEmpty(this.data.get(id)));
        }
    
        public Mono<User> getById(final String id) {
            return Mono.justOrEmpty(this.data.get(id))
                    .switchIfEmpty(Mono.error(new ResourceNotFoundException()));
        }
    
        public Mono<User> createOrUpdate(final User user) {
            this.data.put(user.getId(), user);
            return Mono.just(user);
        }
    
        public Mono<User> delete(final String id) {
            return Mono.justOrEmpty(this.data.remove(id));
        }
         public void fromStream () {
            SortedMap<String, Charset> charSetMap = Charset.availableCharsets();
            Stream<String> charSetStream = charSetMap.keySet().stream();
            Flux<String> charsetFlux = Flux.fromStream(charSetStream);
            charsetFlux.subscribe(System.out::println);
        }
    
          public void range() {
            Flux.range(1, 5).subscribe(System.out::println);
            // 溢出
            Flux.range(Integer.MAX_VALUE, 5).subscribe(System.out::println);
        }
    }
    

    以上代码使用Map完成了关于用户的增删改查操作。这也是我们在项目中运用最多的操作。如果只是想要在完成时给出完成信号,就可以使用 Mono<Void>。
    接下来对service中用到的一些方法进行讲解:

    • justOrEmpty|just
      这个方法比较简单,直接将参数传进方法然后返回。justOrEmpty只是比just多了一个判空操作,防止空指针。

    • Flux.fromIterable:fromIteratble方法使用接收到的Iterable对象构造Flux流,数据返回的顺序和Iterable的next方法返回数据的顺序一致。如下例子中使用fromIteratble构造了JVM支持的字符集的Flux流。

    • fromSteam方法:
      Flux数据流同样可以使用java.util.stream.Stream对象构造出来,数据返回的顺序和Stream.iterator()方法返回的Iterable对象的next方法返回数据的顺序一致。如代码中fromSteam方法使用fromSteam构造了JVM支持的字符集的Flux流。

    • range
      range(int start, int count)构造了一个Flux<Integer>流,返回从 [start,start+count) 区间的整数。如果该方法有类似于range(int start, int step,int count)的重载就更完美了。注意,range方法会处理整数溢出的场景,在溢出时抛出异常。

    • empty:方法返回一个没有任何数据、异常的流。

    • error:方法返回一个没有任何数据,只有异常的流程。

    • never:方法返回一个不会发送任何通知额流程。
      以上三个流都会触发Subscriber的onSubscribe回调,都不会触发onNext回调。同时empty流会触发onComplete回调,error流会触发onError回调。never方法只触发Subscriber的onSubscribe回调,不会触发其他任何回调。
      当然WebFlux还有更多高级的用法。

    相关文章

      网友评论

        本文标题:Spring Boot实战-使用WebFlux进行响应式编程(2

        本文链接:https://www.haomeiwen.com/subject/ghwfyqtx.html