spring-webflux - 在 Reactor 中使用 Flux.push() 会丢失一些项目

标签 spring-webflux project-reactor reactor

我的代码如下:

public class SequenceCreator {

    public Consumer<List<Integer>> consumer;

    public Flux<Integer> createNumberSequence() {
        return Flux.push(sink -> consumer = items -> items.forEach(sink::next));
    }

    public static void main(String[] args) throws InterruptedException {
        SequenceCreator sequenceCreator = new SequenceCreator();

        List<Integer> sequence1 = Lists.newArrayList(1,2,3,4,5);
        List<Integer> sequence2 = Lists.newArrayList(6,7,8,9,10);

        Thread producingThread1 = new Thread(
                () -> sequenceCreator.consumer.accept(sequence1));

        Thread producingThread2 = new Thread(
                () -> sequenceCreator.consumer.accept(sequence2));

        sequenceCreator.createNumberSequence().subscribe(System.out::println);

        producingThread1.start();
        producingThread2.start();

        while (true) {
            Thread.sleep(1000);
        }
    }
}

输出为

1 2 3 4 5 7 8 9 10

不知道为什么没有输出数字6?是多线程的原因吗?

最佳答案

I don't know why the number 6 is not output?Is it the cause of multi-thread?

是的,几乎可以肯定。查看 Flux.push 的 Javadoc :

Programmatically create a Flux with the capability of emitting multiple elements from a single-threaded producer through the FluxSink API. For a multi-threaded capable alternative, see create(Consumer).

您没有使用单线程生产者(违反了记录的要求),因此在这种情况下行为本质上是未定义的。您需要按照文档建议切换到 Flux.create,因为您使用多个线程进行发布。

关于spring-webflux - 在 Reactor 中使用 Flux.push() 会丢失一些项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59624373/

相关文章:

spring - 响应式(Reactive) WebClient 不发出响应

java - 使用 Spring Data R2DBC 查找/修改/保存或更新插入

java - react 堆中的 map 与平面 map

java - 我应该使用 "then"还是 "flatMap"来控制流?

python - 如何解决扭曲中对多个 react 器的需求

spring - 如果 webflux mono 的条件在 kotlin 中为真,则仅在 mongo db 中存储用户

java - 如何注销 Spring WebFlux WebClient 请求的失败响应正文,同时将响应返回给调用者?

java - Vert.x:最简单的 1000 rps 服务器

java - 在后台使用 Netty 与 Tomcat 时,Spring WebFlux 的差异

java - 如何对 Reactor Flux 流中的值求和?