【问题标题】:Reactor Flux with blockLast() Spring Boot integration test never spins up带有 blockLast() 的 Reactor Flux Spring Boot 集成测试永远不会启动
【发布时间】:2021-03-26 08:42:32
【问题描述】:

我有一个 Kafka 处理 Spring Boot 应用程序,它有一个在应用程序启动时运行的方法(使用 ApplicationRunner)并启动一个利用 blockLast() 的 Flux,因为我发现调用 subscribe() 不会发生任何事情,因为它不会阻塞主线程,我发现它可以(并且将会)在 Flux 发出任何元素之前完成。

现在我正在为此方法创建集成测试,我遇到的问题是上下文/应用程序永远不会完全启动,所以我的测试代码永远不会执行,应用程序启动只是达到某个点并挂起永远。当我将 blockLast() 更改为 subscribe() 时,测试代码运行(尽管我不确定它测试的 Flux 代码是否以这种方式正确运行,到目前为止我只有一个微不足道的虚拟测试),我可以看到我的主要执行带有 Flux 代码的方法。有人对我如何在这种情况下创建集成测试有任何想法吗?

【问题讨论】:

    标签: spring spring-boot project-reactor spring-boot-test reactor


    【解决方案1】:

    我遇到了类似的问题,我通过将轮询任务分派给执行器服务来绕过它:

    @PostConstruct
    public void init() {
        this.executorService.submit(() -> pollingTask());
    }
    

    【讨论】:

    • 谢谢,这似乎有效!我正在使用 singleThreadExecutor 并且我的 Flux 代码使用 subscribe() 运行良好,并且我的集成测试运行。但是我在启动时开始收到此错误: javax.management.InstanceAlreadyExistsException: kafka.consumer:type=app-info,id=ihenots-ncp-client 知道为什么吗? Spring 和 Spring Boot 仍然是新手,因此不确定到底发生了什么或如何添加此 @PostConstruct 方法并避免此问题。再次感谢。
    • 不看代码就很难评论。你应该问一个单独的问题。 @PostConstruct 可以在 javax.annotation 中找到。
    • 想通了。我的类实现了 ApplicationRunner 并且我已经在启动时重写了 run() 来执行这个方法,所以它被调用了两次。摆脱了这一点,我现在使用@PostConstruct 在单独的线程中运行,一切看起来都很好。再次感谢!
    • 如果答案有帮助,请考虑接受它,以便遇到问题的任何人都知道它已解决。
    • 嗨,我确实尝试过,但因为我没有足够的活动所以我无法做到,但我再次尝试并能够做到。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2014-08-12
    • 1970-01-01
    • 2018-09-18
    • 2020-02-25
    • 1970-01-01
    • 2019-08-10
    • 2018-08-27
    • 2017-12-17
    相关资源
    最近更新 更多