SpringWebFlux(下篇)

举报
tanoak 发表于 2018/12/20 10:51:08 2018/12/20
【摘要】 这篇文章承接上篇文章,没有看过的小伙伴可以先去看上篇[SpringFlux入门(上篇)](https://www.jianshu.com/p/00b5a2899039),涉及到的两个重要的对象,Flux和Mono来看下官网是怎么介绍的```Reactor is the reactive library of choice for Spring WebFlux. It provides the...

这篇文章承接上篇文章,没有看过的小伙伴可以先去看上篇[SpringFlux入门(上篇)](https://www.jianshu.com/p/00b5a2899039),涉及到的两个重要的对象,Flux和Mono来看下官网是怎么介绍的


```

Reactor is the reactive library of choice for Spring WebFlux. It provides the Mono and Flux API types to work on data sequences of 0..1 and 0..N 

中文意思:

Reactor是Spring WebFlux的首选反应式编程库。 它提供Mono和Flux API类型来处理0..1和0..N的数据序列

```

文章末尾会附上官网链接地址

## Mono

![素材来自官网](https://upload-images.jianshu.io/upload_images/9819800-fc31d17da2ef8b8d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

```

Mono 是表示包含 0 或者 1 个元素的异步序列

```


创建Mono有两种方法


1. 通过Mono静态方法创建:

  * empty():创建一个不包含任何元素,只发布结束消息的序列。


  * just():可以指定序列中包含的全部元素。创建出来的 Mono序列在发布这些元素之后会自动结束


  * justOrEmpty():从一个 Optional 对象或可能为 null 的对象中创建 Mono。只有 Optional 对象中包含值或对象不为 null 时,Mono 序列才产生对应的元素。


  * error(Throwable error):创建一个只包含错误消息的序列。


  * never():创建一个不包含任何消息通知的序列。


ps:

    ```

    Mono.justOrEmpty(userDao.findById(id));

    ```


2. 通过 create()方法来使用 MonoSink 来创建 Mono。


ps:

   ```

   Mono.create(userMonoSink -> userMonoSink.success(userDao.save(user)));

   ```



## Flux


```

 Flux 是表示包含 0 到 N 个元素的异步序列

```


![素材来自官网](https://upload-images.jianshu.io/upload_images/9819800-fd234eac1b46af0f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


有个大概的认识就差不多了,先上代码


这里照例使用的是模拟的数据,不连接数据库,以免增加上手难度


1. 工具类


```

package com.tanoak.utils;


import com.google.common.collect.Lists;

import com.tanoak.pojo.User;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;


/**

 * @author tanoak@qq.com

 * @Desc 模拟数据类

 */

public class DataUtils {

public static  List<User> users =new ArrayList<>() ;;


public static Map<Long,User> userMap =new HashMap<>();

static {

User user1 = new User(1L,"张三") ;

User user2 = new User(2L,"李四") ;

User user3 = new User(3L,"王五") ;

users.add(user1);

users.add(user2) ;

users.add(user3) ;

userMap.put(1L,user1) ;

userMap.put(2L,user2) ;

userMap.put(3L,user3) ;

}


public static List<User> listUser(){

return users ;

}

public static User findById(Long id){

return userMap.get(id) ;

}


}


```


2. pojo层


   ```

  package com.tanoak.pojo;


import lombok.Data;


/**

 * @author tanoak@qq.com

 * @Desc

 */

//@Data

public class User  {

private Long id ;

private String name ;


public User() {

}


public User(Long id, String name) {

this.id = id;

this.name = name;

}


public Long getId() {

return id;

}


public void setId(Long id) {

this.id = id;

}


public String getName() {

return name;

}


public void setName(String name) {

this.name = name;

}


@Override

public String toString() {

return "User{" +

"id=" + id +

", name='" + name + '\'' +

'}';

}

}

   ```

Lombok在IDEA 18.1版本中会有失效的情况,在这里请教下解决方案

3. Dao层


   ```

   package com.tanoak.demo1.dao;

   

   import com.tanoak.pojo.User;

   import com.tanoak.utils.DataUtils;

   import org.springframework.stereotype.Component;

   

   import java.util.List;

   

   /** 

    * @author tanoak@qq.com

    * @Desc

    */ 

   @Component

   public class UserDao {

   

    public Integer save(User user){

    if(null==user){

    return 0 ;

    }

    System.out.println("保存成功");

    return 1 ;

    }

    public Integer del(Long id){

    if(null!=id){

    System.out.println("删除成功");

    return 1 ;

    }

    return 0 ;

    }

    public Integer update(User user){

    if(null==user){

    return 0 ;

    }

    System.out.println("修改成功");

    return 1 ;

    }

    public List<User> findAll(){

   

    return DataUtils.listUser() ;

    }

   

    public User findById(Long id){

    return DataUtils.findById(id);

    }

   }

   

   ```


4. handle层


   ```

   package com.tanoak.demo1.handler;

   import com.tanoak.demo1.dao.UserDao;

   import com.tanoak.pojo.User;

   import org.springframework.stereotype.Component;

   import reactor.core.publisher.Flux;

   import reactor.core.publisher.Mono;

   import javax.annotation.Resource;

   

   /**

    * @author 656443534@qq.com

    * @Desc 增删查改 可以把它当成Service层

    */

   @Component

   public class UserHandler {

   

    @Resource

    private UserDao userDao;

   

    public Mono<Integer> save(User user) {

    return Mono.create(userMonoSink -> userMonoSink.success(userDao.save(user)));

    }

   

    public Mono<Integer> del(Long id) {

    return Mono.create(userMonoSink -> userMonoSink.success(userDao.del(id)));

    }

   

   

    public Mono<User> findById(Long id) {

    return Mono.just(userDao.findById(id));

    }

   

    public Flux<User> findAll() {

    return Flux.fromIterable(userDao.findAll());

    }

   

    public Mono<Integer> update(User user) {

    return Mono.create(userMonoSink -> userMonoSink.success(userDao.update(user)));

    }

   }

   

   ```


5. Controller层


   ```

   package com.tanoak.demo1.controller;

   

   import com.tanoak.demo1.handler.UserHandler;

   import com.tanoak.pojo.User;

   import org.springframework.web.bind.annotation.*;

   import reactor.core.publisher.Flux;

   import reactor.core.publisher.Mono;

   

   import javax.annotation.Resource;

   

   /**

    * @author 656443534@qq.com

    * @date 2018/5/20 15:51

    * @Desc REST风格

    */

   @RestController

   @RequestMapping("/user")

   public class UserController {

   

    @Resource

    private UserHandler userHandler ;

   

    @PostMapping()

    public Mono<Integer> save(@RequestBody User user) {

    return userHandler.save(user) ;

   

    }

    @GetMapping("{id}")

    public Mono<User> query(@PathVariable("id")Long id) {

    return userHandler.findById(id) ;

    }

   

    @GetMapping()

    public Flux<User> queryAll() {

    return userHandler.findAll() ;

    }

   

    @DeleteMapping("{id}")

    public Mono<Integer> del(@PathVariable("id")Long id) {

    return userHandler.del(id) ;

    }

   

    @PutMapping()

    public Mono<Integer> update(@RequestBody User user) {

    return userHandler.update(user) ;

    }

   }

   

   ```

使用PostMan进行测试,这里截取发送POST请求与DELETE请求


![](https://upload-images.jianshu.io/upload_images/9819800-65968544c12cc7e5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

![](https://upload-images.jianshu.io/upload_images/9819800-b219b69baf8f869b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

   至此一个简单的CRUD项目就完成了,在这里不涉及到数据库,DataUtils充当了数据库,在实际应用中个人感觉距离生产环境还有一段路要走,但是github上已经有关于异步jdbc的解决方案,等后面我研究后再分享出来吧!

   异步JDBC项目地址:[https://github.com/mauricio/postgresql-async](https://github.com/mauricio/postgresql-async)

[异步jdbc与同步性能对比](https://juejin.im/post/58fa9d1d0ce4630061200774)

官网资料:

[WebFlux官网资料](https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html#webflux-fn)

[Flux官网资料](https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Flux.html)

[Mono官网资料](https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Mono.html)

参考博客:

[[泥瓦匠BYSocket](https://www.bysocket.com/)

](https://www.bysocket.com/?p=1987)


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。