单声道:从长时间运行的方法返回结果

时间:2018-01-05 12:49:35

标签: spring-mvc spring-boot reactive-programming

目前我正在开始使用Spring +反应式编程。我的目标是从长时间运行的方法(在数据库上轮询)中返回REST端点的结果。我被困在api上。我根本不知道如何在我的Mono方法中将结果作为FooService.findFoo返回。

@RestController
public class FooController {

  @Autowired
  private FooService fooService;

  @GetMapping("/foo/{id}")
  private Mono<ResponseEntity<Foo> findById(@PathVariable String id) {
    return fooService.findFoo(id).map(foo -> ResponseEntity.ok(foo)) //
      .defaultIfEmpty(ResponseEntity.notFound().build())
  }
  ...
}

@Service
public class FooService {

  public Mono<Foo> findFoo(String id) {
    // this is the part where I'm stuck
    // I want to return the results of the pollOnDatabase-method
  }

  private Foo pollOnDatabase(String id) {
    // polling on database for a while
  }
}

2 个答案:

答案 0 :(得分:1)

这很简单。你可以做到

@Service
public class FooService {

  public Mono<Foo> findFoo(String id) {
    return Mono.just(pollOnDatabase(id));
  }

  private Foo pollOnDatabase(String id) {
    // polling on database for a while
  }
}

答案 1 :(得分:1)

使用Mono.fromSupplier方法! :)

@Service
public class FooService {

  public Mono<Foo> findFoo(String id) {
    return Mono.fromSupplier(() -> pollOnDatabase(id));
  }

  private Foo pollOnDatabase(String id) {
    // polling on database for a while
  }
}

使用此方法,我们将尽快与供应商返回Mono值,即固定时间,该值将由调用方的订阅根据需要进行评估。这是调用长时间运行阻塞方法的非阻塞方式。

请勿对长期运行的计算使用Mono.just,因为它将在返回Mono实例之前运行计算,从而阻塞了给定的线程。