2016-02-17 5 views
14

Ich verwende akka streams graphDSL, um ein lauffähiges Diagramm zu erstellen. Es gibt keine Kompilierungszeitfehler beim Ein-/Ausgang der Stream-Komponenten. Runtime löst folgenden Fehler aus:Fehler beim Erstellen des Diagramms: Anforderung fehlgeschlagen: Die Eingänge [] und Ausgänge [] müssen den Eingängen [in] und Ausgängen [out] entsprechen

Irgendwelche Ideen, was ich überprüfen sollte, um es laufen zu lassen?

requirement failed: The inlets [] and outlets [] must correspond to the inlets [in] and outlets [out] 
at scala.Predef$.require(Predef.scala:219) 
at akka.stream.Shape.requireSamePortsAs(Shape.scala:168) 
at akka.stream.impl.StreamLayout$CompositeModule.replaceShape(StreamLayout.scala:390) 
at akka.stream.scaladsl.GraphApply$class.create(GraphApply.scala:18) 
at akka.stream.scaladsl.GraphDSL$.create(Graph.scala:813) 
at com.flipkart.connekt.busybees.streams.Topology$.bootstrap(Topology.scala:109) 
at com.flipkart.connekt.busybees.BusyBeesBoot$.start(BusyBeesBoot.scala:65) 
at com.flipkart.connekt.boot.Boot$.delayedEndpoint$com$flipkart$connekt$boot$Boot$1(Boot.scala:39) 
at com.flipkart.connekt.boot.Boot$delayedInit$body.apply(Boot.scala:13) 

Die Graphstruktur:

source ~> flowRate ~> render ~> platformPartition.in 
platformPartition.out(0) ~> formatIOS ~> apnsDispatcher ~> apnsEventCreator ~> merger.in(0) 
platformPartition.out(1) ~> formatAndroid ~> httpDispatcher ~> gcmPoolFlow ~> rHandlerGCM ~> merger.in(1) 
merger.out ~> evtCreator ~> Sink.ignore 
+0

Können Sie tatsächlich Ihre Grafik Blueprint? – manub

+1

Ich habe die Frage mit Graphenstruktur aktualisiert. Die Parameter für Quelle/Durchfluss/Senke stimmen alle am Einlass/Auslass überein. – phantomastray

+0

Die Typen 'render',' platformPartition', 'merger' und' evtCreator' könnten ebenfalls nützlich sein. – manub

Antwort

14

Sie haben einen nicht verwendeten Eingang oder Ausgang (eine Ihrer fließt oder etwas nicht auf allen Seiten verbunden). Hier sind einige Beispiele:

Dies funktioniert:

val workingFlow = 
    Flow.fromGraph(GraphDSL.create() { implicit b => 
    import GraphDSL.Implicits._ 
    val intFlow = b.add(Flow[Int]) 
    FlowShape(intFlow.in, intFlow.out) 
    }) 

Der folgende Code erzeugt einen Fehler, ähnlich wie bei Ihnen, weil es eine ganze nicht verwendete Strömung hat:

val buggyFlow = 
    Flow.fromGraph(GraphDSL.create() { implicit b => 
    import GraphDSL.Implicits._ 
    val intFlow = b.add(Flow[Int]) 
    val unusedFlow = b.add(Flow[Int]) // ERROR: This flow is unused 
    FlowShape(intFlow.in, intFlow.out) 
    }) 

Ein etwas komplexeres Beispiel: Hier gibt es nicht einen ganzen ungenutzten Strom, es gibt nur einen ungenutzten Ausgang. Es erzeugt den gleichen Fehler:

val buggyFlow = 
    Flow.fromGraph(GraphDSL.create() { implicit b => 
    import GraphDSL.Implicits._ 

    val broadcast = b.add(Broadcast[Int](2)) 
    val intFlow = b.add(Flow[Int]) 
    val unusedFlow = b.add(Flow[Int]) // ERROR: This flow's outlet isn't used 

    broadcast ~> intFlow 
    broadcast ~> unusedFlow 

    FlowShape(broadcast.in, intFlow.out) 
    }) 
+0

Ja, wir haben das lange rausgefunden. Die Fehlermeldung ist nicht intuitiv. Ich hätte die Frage aktualisieren sollen. :) Danke, obwohl Sie sich damit beschäftigt haben. – phantomastray

Verwandte Themen