Java 执行FluxSink.next时,Spring 5 FluxSink不发送数据

Java 执行FluxSink.next时,Spring 5 FluxSink不发送数据,java,spring-webflux,project-reactor,reactive,Java,Spring Webflux,Project Reactor,Reactive,我有一个GET方法的示例,它生成Randon INT并发送回客户机 @GetMapping public Flux<String> search() { return Flux.create(fluxSink -> { Random r = new Random(); int n; for (int i = 0; i < 10; i++) { n= r.nex

我有一个GET方法的示例,它生成Randon INT并发送回客户机

@GetMapping
public Flux<String> search() {
    return Flux.create(fluxSink -> {

            Random r = new Random();
            int n;
            for (int i = 0; i < 10; i++) {
                n= r.nextInt(1000);
                System.out.println("Creating:"+n);
                fluxSink.next(String.valueOf(n));

                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            fluxSink.complete();


    });
}
@GetMapping
公共流量搜索(){
返回Flux.create(fluxSink->{
随机r=新随机();
int n;
对于(int i=0;i<10;i++){
n=r.nextInt(1000);
System.out.println(“创建:+n”);
next(String.valueOf(n));
试一试{
《睡眠》(2000年);
}捕捉(中断异常e){
e、 printStackTrace();
}
}
fluxSink.complete();
});
}
卷曲:

curl-v-H“接受:文本/事件流”-X GET "

对于使用CURL命令的代码,我只能在fluxSink.complete发生时看到客户机中的数字

现在,如果我将代码更改为:

@GetMapping
public Flux<String> search() {
    return Flux.create(fluxSink -> {
        Thread t = new Thread(() -> {
            Random r = new Random();
            int n;
            for (int i = 0; i < 10; i++) {
                n= r.nextInt(1000);
                System.out.println("Creating:"+n);
                fluxSink.next(String.valueOf(n));

                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            fluxSink.complete();
        });
        t.start();
    });
}
@GetMapping
公共流量搜索(){
返回Flux.create(fluxSink->{
线程t=新线程(()->{
随机r=新随机();
int n;
对于(int i=0;i<10;i++){
n=r.nextInt(1000);
System.out.println(“创建:+n”);
next(String.valueOf(n));
试一试{
《睡眠》(2000年);
}捕捉(中断异常e){
e、 printStackTrace();
}
}
fluxSink.complete();
});
t、 start();
});
}
将进程包装到线程中,效果很好。当fluxSink.next发生时,我可以看到数据传输良好

有人能解释这种效应吗?如果不显式使用线程,如何查看数据流

谢谢大家!

Flux.create()
是关于“通过FluxSink API以同步或异步方式发射多个元素”。在你的例子中,你同步地发射所有元素,你没有机会让反应堆做功,因为在一切完成之前,你永远不会退出那个方法。简而言之,您正在阻塞当前线程,这是Reactor所禁止的

使用线程可以让Reactor发送这些信号。但是
Flux.create()
(见其javadoc)的精神是适应回调

在这种情况下,可能
Flux.generate
更适合。尝试使用
线程
模拟延迟不是一个好主意。您可以改为执行以下操作:

Flux<String> response = Flux.just(aListOfElements).delayElements(Duration.ofSeconds(2));
Flux response=Flux.just(alistofements).delayElements(持续时间秒(2));

sry。。。“在我的客户机中”您必须是指“在您的服务器系统中。输出”(?)…否则我不理解/看到问题/问题…(但仍然向上投票,因为有趣的问题,格式良好:)在我的客户机中,我指的是在我执行curl命令的终端中我得到了您所说的,您是正确的,这是一个简单的示例。在我的现实世界中,我需要从一个非反应源创建我自己的流量。因此,我所做的是将我从flux.create调用的方法包装为@Async spring注释。有了这些,我就能够达到我想要的效果。谢谢,我绝对不建议这样做。您是否为此配置了特定的执行器?在任何情况下,您都应该使用publishOn操作符来处理调度程序上的工作(请参阅reactor参考文档)。这种方法是否能够以某种方式进行调整,以处理具有无休止的元素列表的情况?我的用例看起来,我通过阻塞调用接收一些消息,并尝试将它们作为流量提供。如果您在回调中接收这些消息,那么
Flux.create
应该可以工作。反应堆参考文件中有一些这样的例子。