在使用 WebFlux 时,将 completableFuture 与 CRUD 一起使用是否有意义?

Does it make sense to use completableFuture together with CRUD when working with WebFlux?

我刚开始学习 webFlux.I我刚开始学习 webplus 并且我对 question.If 将 completableFuture 与 CRUD 操作一起使用有意义吗?

也就是说,假设我有 RestService:

@RestController
@AllArgsConstructor
public class personController {
    personServiceImpl personService;

    @GetMapping("/all")
    Flux<Person> getAllPerson(){
        return personService.findAll();
    }

    @PostMapping("/save")
    public Mono<Person> post(@RequestBody Person user) {
        System.out.println("inside***************");
        return personService.saveOrUpdate(user);
    }
}

做这样一个处理请求的服务有意义吗?

personServiceImpl:

public class personServiceImpl implements personService{

  personRepository repository;

  @Override
  public Mono<Person> saveOrUpdate(Person person) {
     CompletableFuture<Person> future = CompletableFuture.supplyAsync(() -> {
           repository.save(person);
           return person;
     });

     return Mono.fromFuture(future);
     
  }

  @Override
  public Mono<Person> findByEmail(String email) {

     CompletableFuture<Person> future = CompletableFuture.supplyAsync(() -> {

            Person person = repository.findByEmail(email);
            return person;
     });
     return Mono.fromFuture(future);
     
  }
}

或者只是没有 Future 的常规调用会更好?

public class personServiceImpl implements personService{

  personRepository repository;

  @Override
  public Mono<Person> saveOrUpdate(Person person) {
     return repository.save();
  }

  @Override
  public Mono<Person> findByEmail(String email) {

     return repository.findByEmail();
  }
}

如果你能帮助我理解 Future 在这里是否有意义,我将很高兴。

在你的情况下它没有意义。 WebFlux 已经是非阻塞的,这意味着您的应用程序将能够在等待数据库 return 查询结果的同时处理其他请求/进程。

Futures 更适合可能需要几秒钟甚至几分钟的非常昂贵的过程。在您的情况下,您正在执行简单的数据库查询,这些查询应该 return 在几毫秒内得到结果,因此您并没有真正从 CompletableFuture 方法中受益,它甚至可能适得其反。

坚持使用 WebFlux Monos 和 Fluxs 并摆脱 CompletableFuture 方法。从简单开始,不要无缘无故地尝试优化您的代码。使用您可以实现且实际有效的最简单代码,除非您确实需要,否则不要将其过度复杂化。