簡體   English   中英

急停Akka流源

[英]Eagerly stop an Akka-Stream Source

我有以下(簡化)使用者,應該在第一個項目之后取消Akka-Stream(今天為2.11_2.5-SNAPSHOT) Source ,但onNext仍被調用4次:

static Subscriber<Object> println() {
    return new Subscriber<Object>() {

        Subscription s;

        int n;

        @Override
        public void onSubscribe(Subscription s) {
            this.s = s;
            s.request(5);
        }

        @Override
        public void onNext(Object t) {
            System.out.println(Thread.currentThread().getName() 
                  + ": " + t + " - " + (++n));
            if (s != null) {
                s.cancel();
                s = null;
            }
        }

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

        @Override
        public void onComplete() {
            System.out.println(Thread.currentThread().getName() + ": DONE");
        }
    };
}

public static void main(String[] args) throws Exception {
    Config cfg = ConfigFactory.parseResources(
        AkkaRange.class, "/akka-streams.conf").resolve();
    ActorSystem actorSystem = ActorSystem.create("sys", cfg);

    ActorMaterializer materializer = ActorMaterializer.create(actorSystem);

    Source<Integer, NotUsed> source = Source.repeat(1);

    Publisher<Integer> p = source.runWith(Sink.asPublisher(
         AsPublisher.WITH_FANOUT), materializer);

    p.subscribe(println());

    Thread.sleep(1000);

    actorSystem.terminate();
}

假設請求為5,但只進行了4次調用,我假設底層消息傳遞體系結構在檢查消息隊列中是否有取消消息​​(或其他請求)之前,先對4個批處理中的請求進行響應。

是否有設置可以使取消更緊急地進行?

用例類似於互操作性計算,其中有一個計算密集型階段(映射),在1-2個源元素之后可能會產生期望的結果,在這種情況下下游會取消該流。 問題是由於這4個批次,對剩余的2-3個元素也執行了計算。

Subscriber接口是Reactive Streams規范的一部分,該規范實現了許多庫(包括akka流)。 並且此規范聲明了以下內容:

如果仍有請求的元素待處理,則訂閱者必須准備在調用Subscription.cancel()之后接收一個或多個onNext信號[參見3.12]。 Subscription.cancel()不保證立即執行基礎清潔操作。

因此,您必須在訂戶中手動處理這種情況,否則將違反規范,因此不適合與實現規范的庫一起使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM