提交方法将不会调用onNext FLOW STREAM API JAVA

时间:2019-10-01 22:57:57

标签: java reactive-programming publish-subscribe java-9

我正在学习Java中的FLOW Stream API,目前正在基于oracle community上的示例创建一个示例。问题是我看不到预期的输出,而只是看到onSubscribe方法内打印的SUBSCRIBING字符串。我已经检查并在StackOverflow上找到了submissionpublisher-on-submit-not-invoking-onnext-of-subscriber,但是由于我已经在呼叫request(Long N)而无法使用。

import java.util.concurrent.Flow;

public class Computer<T> implements Flow.Subscriber<T> {

    private Flow.Subscription subscription;

    @Override
    public void onSubscribe(Flow.Subscription subscription) {
        this.subscription = subscription;
        System.out.println("SUBSCRIBING");
        this.subscription.request(1);
    }

    @Override
    public void onNext(T item) {
        System.out.println(String.format("Got %s", item.toString()));
        this.subscription.request(1);
    }

    @Override
    public void onError(Throwable throwable) {
        throwable.printStackTrace();
    }

    @Override
    public void onComplete() {
        System.out.println("DONE");
    }

}

-

import java.util.List;
import java.util.concurrent.SubmissionPublisher;

public class Sensor {

    public static void main(String[] args) {
        SubmissionPublisher<String> submissionPublisher = new SubmissionPublisher<>();
        Computer<String> subscriber = new Computer<>();
        submissionPublisher.subscribe(subscriber);

        List<String> items = List.of("1.25", "1.224", "1.55");
        items.forEach(submissionPublisher::submit);
        submissionPublisher.close();
    }

}

我刚看到:

SUBSCRIBING

为什么未调用onNext方法?

1 个答案:

答案 0 :(得分:1)

您没有将ScheduledExecutorService传递给Publisher,而import java.util.List; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.SubmissionPublisher; public class Sensor { public static void main(String[] args) { ScheduledExecutorService executor = Executors.newScheduledThreadPool(Runtime.getRuntime().availableProcessors()); SubmissionPublisher<String> submissionPublisher = new SubmissionPublisher<>(executor, 5); Computer<String> subscriber = new Computer<>(); submissionPublisher.subscribe(subscriber); List<String> items = List.of("1.25", "1.224", "1.55"); items.forEach(submissionPublisher::submit); submissionPublisher.close(); executor.shutdown(); } } 基本上是一个ExecutorService,可以安排任务在延迟后运行或在每次执行之间以固定的时间间隔重复执行。 / p>

navigationlevel.cs