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