[英]How to create a custom Uniform Fan Out Shape in Akka through the Java library
所以我正在構建一個 Akka 自定義組件來學習框架。 我需要創建一個 UnifromFanOut 形狀自定義組件。 所以我嘗試擴展形狀,但問題是如何創建具有 1 個輸入和 3 個輸出的形狀。 class 需要一個 seq object,它是 Scala 的一部分,但我對整個形狀本身是否正確感到有點困惑。 我剛開始學習 Akka 所以我可以理解我的方法是否錯誤。 此外,我練習的目的是創建一個自定義組件,我知道我可以通過 GraphDSL 完成邏輯,但它需要是一個自定義組件。 我的問題是如何正確創建此形狀。 (文檔不是自定義組件的最佳選擇)
public final Inlet<DeviceInfo> in = Inlet.create("Map.in");
public final Outlet<DeviceInfo> temp_out = Outlet.create("Map.out");
public final Outlet<DeviceInfo> humidity_out = Outlet.create("Map.out");
public final Outlet<DeviceInfo> illumination_out = Outlet.create("Map.out");
//Does not work
private final UniformFanOutShape<DeviceInfo, DeviceInfo> shape = UniformFanOutShape.apply(in, Arrays.asList(temp_out, humidity_out));
@Override
public UniformFanOutShape<DeviceInfo, DeviceInfo> shape() {
return shape;
}
[編輯] TL; DR 您基本上需要解決從 Java 調用 Scala vararg 方法的問題。您可以使用scala.collection.mutable.ArrayBuffer
這樣做
ArrayBuffer<Outlet<DeviceInfo>> arrayBuffer = new ArrayBuffer<>();
arrayBuffer.append(temp_out);
arrayBuffer.append(humidity_out);
arrayBuffer.append(illumination_out);
final UniformFanOutShape<DeviceInfo, DeviceInfo> shape =
UniformFanOutShape.apply(in, arrayBuffer.toSeq());
資料來源: 如何使用 Java 代碼中的 Scala 可變參數
[/編輯]
(文檔不是自定義組件的最佳選擇)
我不同意。 文檔非常全面( https://doc.akka.io/docs/akka/current/stream/stream-customize.html )
您不應擴展UniformFanOutShape<DeviceInfo, DeviceInfo>
,而應擴展 GraphStage GraphStage<UniformFanOutShape<DeviceInfo, DeviceInfo>>
。
然后你需要覆蓋兩個方法:
public UniformFanOutShape<DeviceInfo, DeviceInfo> shape() {
//implement
}
@Override
public GraphStageLogic createLogic(Attributes inheritedAttributes) {
//implement
}
該文檔向您展示了如何創建形狀以及如何使用有關處理背壓等的詳細信息來實現GraphStageLogic
。
該文檔顯示了SourceShape
、 SinkShape
和FlowShape
的示例。 如果您了解這些示例,但需要更多指導,您可以查看源代碼。 在akka.stream.scaladsl.Graph.scala
,您可以找到所有內置GraphStage
的 Akka Streams 提供的實現。 例如Broadcast
是UniformFanOutShape
階段的一個例子,它的代碼是這樣開始的:
final class Broadcast[T](val outputPorts: Int, val eagerCancel: Boolean) extends GraphStage[UniformFanOutShape[T, T]]
該實現不到 100 行代碼,並遵循與文檔所示相同的模式。 代碼是 Scala,因為 Akka 是用該語言實現的,帶有一個薄的 Java 層,旨在從 Java 代碼中使用。 因此,例如還有akka.stream.javadsl.Graph.scala
,但您會看到那里的代碼委托給scaladsl
package 中的實現。您會在整個 Akka 代碼中看到該模式。 所以簡而言之,您需要了解一些 scala 才能理解其實現,但在本例中,它與 Java 的實現非常相似。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.