0

我刚开始学习 webFlux。我刚开始学习 webplus,我对问题很感兴趣。将 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 在这里是否有意义,我会很高兴。

4

1 回答 1

1

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

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

只需坚持使用 WebFluxMonoFluxs 并摆脱这种CompletableFuture方法。从简单开始,不要无缘无故地尝试优化你的代码。使用你可以实现的最简单的代码,它确实有效,除非你真的有需要,否则不要过于复杂。

于 2021-12-13T23:55:43.083 回答