目前我正在开始使用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
}
}
答案 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
实例之前运行计算,从而阻塞了给定的线程。