spring 在Mono上订阅从不执行

omhiaaxx  于 2023-01-08  发布在  Spring
关注(0)|答案(1)|浏览(398)

在下面的示例中(在Reactive Spring环境中),“第一个单声道执行”从未打印,而“第二个单声道执行”打印。知道为什么吗?

oAuth2AuthorizedClientService.loadAuthorizedClient(MYCLIENTID, MYPRINCIPALNAME)
        .subscribe(s -> System.out.println("FIRST MONO EXECUTED"));

Mono.just(new TokenResponse()).subscribe(s -> System.out.println("SECOND MONO EXECUTED"));

其中,oAuth2AuthorizedClientService是一个注入的被动式OAuth2AuthorizedClientService Bean。
我希望第一个Mono能够解决。

xqkwcwgp

xqkwcwgp1#

我认为你看不到第一个发布者的结果,因为loadAuthorizedClient内部的实际调用是在另一个线程中进行的,执行是在它上面进行的。当你在第一个发布者上调用subscribe()时,你会立即继续执行你的方法,所以你只需要创建“literal”的Mono.just(),并订阅这个mono。而且它会立即在你的线程中打印出你的单声道的结果(因为它已经完成了)(没有线程切换)。
假设您在@Test中执行所有这些操作,此时测试结束,第一个调用loadAuthorizedClient仍在执行,因此您无法看到第一个发布者的结果。
出于测试目的,您可以放置Thread.sleep(n)以等待第一个发布程序完成

相关问题