前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring Boot实战-使用WebFlux进行响应式编程(2)

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

作者头像
我的小熊不见了丶
发布2019-05-22 21:42:09
1.5K0
发布2019-05-22 21:42:09
举报
文章被收录于专栏:晓月寒·晓月寒·

新建一个UserController.java

代码语言:javascript
复制
@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
代码语言:javascript
复制
@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还有更多高级的用法。
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.02.20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档