2017-07-05 1 views
0

Je suis assez nouveau dans GraphDSL de akka flux. Je suis fait DSL pour un cadre de test que nous avons, jusqu'ici ça va, mais je suis face au problème que je ne peux pas avoir une nouvelle ligne quand les gens utilisent la LISCréer une nouvelle ligne dans GraphDSL

ici un exemple:

Given("A url='http://localhost:8080/hello_dls_world'") ~> When(s"I make a request") ~> AndThen("I expect to receive 200") 

Comme vous pouvez voir la ligne c'est gros et pourrait même être pire.

Utilisation du constructeur je crée une solution, mais je ne pense pas que d'une manière très agréable

object TestDSL extends MainDSL with App { 

    import GraphDSL.Implicits._ 

    val runnableGraph = RunnableGraph.fromGraph(GraphDSL.create() { implicit builder => 

    val in = newLine(builder).in 
    val out = newLine(builder).out 

    Given("This_is_a_hello_world") ~> When(s"I change character _") ~> in 

    out ~> AndThen("I expect to receive 200") ~> Then("I expect to receive 200") 

    ClosedShape 
    }) 

    runnableGraph.run() 
} 

Ceci est ma mise en œuvre DSL

class MainDSL { 

    implicit val system = ActorSystem() 
    implicit val materializer = ActorMaterializer() 

    def Given(sentence: String) = Source.single(sentence.toUpperCase) 

    def When(sentence: String) = Flow[Any].map(x => x.asInstanceOf[String].replace("_", " ")) 

    def Then(sentence: String) = Sink.foreach[Any](x => println(s"######## $x")) 

    def AndThen(sentence: String) = Flow[Any].map(x => x) 

    def newLine(builder: Builder[NotUsed]) = builder.add(Flow[Any].map(x => x)) 

} 

Quelqu'un ici peut me donner une meilleure solution s'il vous plaît?

Quand je cours, je reçois cette erreur

Exception in thread "main" java.lang.IllegalArgumentException: requirement failed: The inlets [] and outlets [] must correspond to the inlets [Map.in] and outlets [Map.out] 
    at scala.Predef$.require(Predef.scala:224) 
    at akka.stream.Shape.requireSamePortsAs(Shape.scala:168) 
    at akka.stream.impl.StreamLayout$CompositeModule.replaceShape(StreamLayout.scala:427) 
    at akka.stream.scaladsl.GraphApply$class.create(GraphApply.scala:19) 
    at akka.stream.scaladsl.GraphDSL$.create(Graph.scala:993) 
    at stream.dsl.TestDSL$.delayedEndpoint$stream$dsl$TestDSL$1(TestDSL.scala:22) 
    at stream.dsl.TestDSL$delayedInit$body.apply(TestDSL.scala:18) 
    at scala.Function0$class.apply$mcV$sp(Function0.scala:34) 
    at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12) 
    at scala.App$$anonfun$main$1.apply(App.scala:76) 
    at scala.App$$anonfun$main$1.apply(App.scala:76) 
    at scala.collection.immutable.List.foreach(List.scala:381) 
    at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:35) 
    at scala.App$class.main(App.scala:76) 
    at stream.dsl.TestDSL$.main(TestDSL.scala:18) 
    at stream.dsl.TestDSL.main(TestDSL.scala) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) 

Cordialement

Répondre

1

Vous devriez être en mesure de diviser en spécifiant in et out ports de la forme de vos flux, par exemple

val when = builder.add(When(s"I change character _")) 

Given("This_is_a_hello_world") ~> when.in 
when.out ~> AndThen("I expect to receive 200") 
+0

Ce n'est pas la compilation. Peut-être que c'est mieux si je montre aussi mon implémentation dsl – paul

+0

J'ai sauté en ajoutant le flux au constructeur. J'ai modifié la réponse –

+0

J'ai essayé ce que vous suggérez et j'ai eu l'erreur que je colle dans ma question. Une idée pourquoi? Cordialement!! – paul