我已阅读{{3}},了解流的具体化是:
获取流描述(图表)并分配运行所需的所有必要资源的过程。
我按照一个示例使用mapMaterializedValue构建我的akka流,以将消息发送到队列。代码的目的是在流蓝图构建并且代码正常工作之后将消息推送到队列但我真的不明白mapMaterrializaedValue在代码中做了什么:
ConvertStringSecurityDescriptorToSecurityDescriptorW
答案 0 :(得分:5)
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的代码,因为您执行此队列 - &gt;回调转换只进行一次,并将其封装在方法中。
但是,在你的情况下,你真的不需要它。您正在使用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);