我正在开发一个使用 Spring WebFlux 堆栈的项目。我们有一个控制器,您可以在其中订阅特定对象的更新。此控制器返回EmitterProcessor客户端可以订阅的位置。当某些内容在 上发布时EmitterProcessor,订阅的客户端会收到通知。
这在实践中效果很好,但我的单元测试失败了。单元测试使用WebTestClient,它在exchange()操作返回 a时阻塞EmitterProcessor(也尝试了其他FluxProcessor实现,例如UnicastProcessor)。我得到的错误如下:
java.lang.IllegalStateException:5000 毫秒的阻塞读取超时
at reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:117)
at reactor.core.publisher.Mono.block(Mono.java:1524)
at org.springframework.test.web.reactive.server.DefaultWebTestClient$DefaultRequestBodyUriSpec.exchange(DefaultWebTestClient.java:283)
Run Code Online (Sandbox Code Playgroud)
我找到了这个线程,它也报告exchange()了WebTestClient块上的方法,但正如那里所解释的那样,它只是为了检索状态和标题而阻塞,所以这应该不是问题。此外,在Flux返回a 的情况下,这可以正常工作,如引用的testcase 所示。
我创建了一个从引用的测试用例派生的简单测试用例,并将其调整为Flux在一种情况下返回 a ,EmitterProcessor在另一种情况下返回an (失败)。您可能会注意到, 的断言EmitterProcessor应该失败,但由于阻塞exchange()调用,它永远不会到达那里。
另请注意,当我取消注释该行时processor.onNext("hello");,将返回此内容并且测试用例成功。
at reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:117)
at reactor.core.publisher.Mono.block(Mono.java:1524)
at org.springframework.test.web.reactive.server.DefaultWebTestClient$DefaultRequestBodyUriSpec.exchange(DefaultWebTestClient.java:283)
Run Code Online (Sandbox Code Playgroud) 我知道与Spring Framework相反,Spring Boot 不支持Spring WebFlux应用程序的WAR部署。我的问题很简单:将来会否出现?
我的用例是这样的:我们仍然有很多客户仍然生活在传统的“我们将所有内容都部署在应用程序服务器X”上。因此,尽管我们希望推出独立的JAR,但尚未准备就绪。我们大量使用Spring Boot,并且确实希望继续使用Spring Boot,因此放弃它不是一种选择。
我们正在构建反应性应用程序,并希望为此使用Spring WebFlux,但是我们仍然需要部署到应用程序服务器,因此这不是一种选择。在此期间,我们避免使用Spring WebFlux,而只使用Controllers,它虽然有效,但并不那么优雅。因此,我的问题。