【问题标题】:Why can I not access class variables from onComplete in Flow API Subscriber为什么我不能从 Flow API 订阅者中的 onComplete 访问类变量
【发布时间】:2020-12-01 18:05:28
【问题描述】:

使用 Java Flow API。我有一个Processors 链和一个终端Subscriber。 我已经编写了Subscribers 的代码,其中保留了收到的物品的计数,这些物品与SubmissionPublisher 配合使用。

但是,当我将值从Processor(扩展SubmissionPublisher)传递到下面的Subscriber 时,控制台不会打印任何输出。

如果我删除 minValue.get(),文本将打印到控制台。 为什么调用类变量导致onComplete没有按预期执行?

public class MinValue implements Subscriber<Integer> {

    private Flow.Subscription subscription;
    private AtomicInteger minValue=new AtomicInteger(Integer.MAX_VALUE);

    @Override
    public void onSubscribe(Flow.Subscription subscription) {
        this.subscription = subscription;
        subscription.request(1);
    }

    @Override
    public void onNext(Integer item) {
        if(minValue.get()>item){
            System.out.println("Min Value : "+item);
            minValue.set(item);
        }
        subscription.request(1);
    }

    @Override
    public void onError(Throwable throwable) {
        System.out.println("Error  + throwable.getMessage() \nMin Value is : "+minValue.get());
    }

    @Override
    public void onComplete() {
        System.out.println("Successful Completion  - Min Value is : "+minValue.get());
    }
}

编辑 - 添加最小可重现示例

   public class NewClass {
           public static void main(String args[]) {
           SubmissionPublisher<Integer> publisher = new SubmissionPublisher<>();
           Subscriber<Integer> subscriber = new MinValue();

           publisher.subscribe(subscriber);
  
           publisher.submit(10);
           publisher.submit(11);
           publisher.submit(9);
           publisher.submit(12);
           publisher.submit(8);

           publisher.close();
       }
   }

【问题讨论】:

标签: java flow subscriber


【解决方案1】:

minValue.get() 返回一个 int 而 item 是一个 Integer 对象。也许这就是问题所在。

【讨论】:

    【解决方案2】:

    问题是主线程在订阅者 onComplete() 被调用之前就退出了。

    如果我在调用 publisher.close() 后添加睡眠,subscriber.onComplete() 有时间在自己的线程上执行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-16
      • 2017-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多