如何解决关于反应式数据库获取 R2DBC
我想知道 Java Reactive Flux 如何在 Web 应用程序中工作。
下面是一个简单的Java主程序来演示Flux:
public static void main(String[] args) {
callingFlux();
}
private static void callingFlux() {
System.out.println( Thread.currentThread().getName() +" Test 0 ");
Flux<String> results = readFluxStream();
System.out.println( Thread.currentThread().getName() +" Test 1 ");
results.map(String::toUpperCase).doOnNext(System.out::println).subscribe();
System.out.println(Thread.currentThread().getName() + " Test 2 ");
}
public static Flux<String> readFluxStream() {
System.out.println(Thread.currentThread().getName()+ " Test 0.1 ");
String[] speech = {"Well","you","were","born"};
System.out.println( Thread.currentThread().getName()+" Test 0.2 ");
Flux<String> temp=Flux.fromArray(speech).delayElements(Duration.ofSeconds(1)).log();
System.out.println( Thread.currentThread().getName()+" Test 0.3 ");
return temp;
}
在这个程序中,我们没有看到 Flux 流的输出被打印出来。 这是因为访问 Flux 流发生在不同的线程中。由于主线程提前终止,我们无法看到 Flux 输出。 (如果我们在主线程中引入延迟,那么我们可以在控制台中看到以不同线程名称打印的 Flux 输出)。
这表明 Flux 是在不同的线程中读取的。
假设我们使用的是 R2DBC,它在下面的示例存储库代码中返回一个 Flux 流:
@Query("select id,name,age from player where name = $1")
Flux<Player> findAllByName(String name);
如果我遍历这个结果集,会不会发生在不同的线程中?如果这个数据需要返回给一个控制器,那么如果这个代码运行在不同的线程中会怎样?
例如在下面的代码中,如果我没有 blockLast 则执行发生在不同的线程中。如果我最后使用 block ,那么它实际上不是非阻塞
repository.findAll().doOnNext(player -> {
log.info(player.toString());
}).blockLast(Duration.ofSeconds(10));
或者是注册了一个回调,一旦得到数据库结果,就会继续执行原来的http线程。
让我知道我是否误解了这个例子中 Rx 编程的概念?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。