反应堆:Flux <object> .subscribe()与.toStream()

时间:2019-11-25 19:53:36

标签: java flux reactor spring-reactive

我有一个函数:Flux queryPerson(),它查询数据库以生成对象并以Flux返回它们。当我使用.subscribe()时,该应用程序仅通过代码运行并退出。它不等待结果返回查询。但是当我使用.toStream()阻止流时,我可以看到打印输出。我在做什么错了?

    public static String converter(String userInput) {
        String endProduct = "";
        char c = userInput.charAt(0);
        Stack<Character> stack = new Stack<Character>();
        int len = userInput.length();
        //iterates through the word to find symbols and letters, if letter or digit it appends to endProduct, if symbol it pushes onto stack
        for (int i = c; i < len; i++) {
            if (Character.isLetter(userInput.charAt(i))) {
                endProduct = endProduct + c;
                System.out.println(c);
            }//end if
            else if(Character.isDigit(userInput.charAt(i))){
                endProduct = endProduct + c;
                System.out.println(c);
            }

1 个答案:

答案 0 :(得分:2)

我假设您没有某种Web应用程序,而是命令行运行器或简单的Java应用程序。考虑到应用程序在异步任务之前完成是正常的。

.subscribe

订阅是一种使用传入数据的异步方法,在Flux上订阅后,您立即将控制权返回给调用线程。

这正是反应式编程的工作原理,定义行为,在其他一些线程中以及与调用线程一起运行它的抽象方法。

Flux docs中所述

  

由于序列可以是异步,因此它将立即返回   控制到调用线程。这可以给人的印象   在主线程或单元测试中执行时,不会调用使用者   例如。

.toStream

另一方面,通过 .toStream 您会收到一个Java Stream,即使它的大小未知,您仍然可以像普通Java Stream一样以同步方式对其进行迭代。

更多说明,请参见.toStream docs of Flux