2017-06-14 101 views
2

我已閱讀Akka streams materialization concept,並理解流物化是:阿卡流:是什麼mapMaterializedValue意味着

,以運行服用流描述(圖),並分配它需要的所有必要資源的過程。

我跟着一個例子,使用mapMaterializedValue構建我的akka​​流,將消息發送到隊列。代碼的目的是推動信息流藍圖後,排隊已經建立和代碼工作,但我真的不明白是什麼mapMaterrializaedValue代碼做:

Promise<SourceQueueWithComplete<String>> promise = new Promise.DefaultPromise<>(); 

Source<String, SourceQueueWithComplete<String>> s = Source 
    .queue(100, OverflowStrategy.fail()) 
    .mapMaterializaedValue(queue -> { 
     promise.trySuccess(queue); 
    }); 

source.toMat(Sink.foreach(x -> System.out.println(x)), Keep.left()).run(materIalizer); 

promise.<SourceQueueWithComplete<String>>future().map(mapMapperFunction(), actorSystem.dispatcher()); 

回答

4

mapMaterializedValue目的是在物化後立即轉化物化價值。例如,假設你有接受這樣的回調第三方庫:

interface Callback<T> { 
    void onNext(T next); 
    void onError(Throwable t); 
    void onComplete(); 
} 

然後你就可以創建一個返回Source<T, Callback<T>>其物化價值,你可以立即傳遞給第三方庫的方法時,流實際運行:

<T> Source<T, Callback<T>> callbackSource() { 
    return Source.queue(1024, OverflowStrategy.fail()) 
     .mapMaterializedValue(queue -> new Callback<T> { 
      // an implementation of Callback which pushes the data 
      // to the queue 
     }); 
} 

Source<Integer, Callback<Integer>> source = callbackSource(); 

Callback<Integer> callback = source 
    .toMat(Sink.foreach(System.out::println), Keep.left()) 
    .run(materializer); 

thirdPartyApiObject.runSomethingWithCallback(callback); 

你可以在這裏看到,因爲你這樣做隊列這可以簡化必須使用這樣一種第三方API的代碼 - >回調轉變只有一次,在一個封裝它方法。

然而就你而言,你並不需要它。您正在使用mapMaterializedValue完成與物化價值,這是完全沒有必要的外部承諾,因爲你可以直接使用它的物化後的物化值:

Source<String, SourceQueueWithComplete<String>> s = Source 
    .queue(100, OverflowStrategy.fail()); 

SourceQueueWithComplete<String> queue = source 
    .toMat(Sink.foreach(x -> System.out.println(x)), Keep.left()) 
    .run(materIalizer); 

mapMapperFunction().apply(queue); 
+1

謝謝弗拉基米爾,mapMaterializedValue的很清楚交代,現在我瞭解它是如何工作的。關於物化價值的另外一個問題,就像未來? – zt1983811

+2

否;物化價值既不要求爲期貨(例如,這些例子中的排隊不會被作爲未來返回,雖然有時候墊價值是未來),也不與期貨「相似」 - 唯一的這種相似性是mapMaterializedValue'和'Future.map'方法名稱中的子字符串'map',這是因爲這種轉換幾乎總是被稱爲'map'。你可以在我的答案[這裏]找到更多關於物化值的內容(https://stackoverflow.com/questions/39727729/akka-streams-what-does-mat-represents-in-sourceout-mat/39729078#39729078)。 –

+0

感謝您的回答,我會看看那篇文章。 – zt1983811