我尝试使用akka-streams和akka-http来解决以下问题:
我想出了以下代码,以便将传入的连接合并到一个输出:
val g = RunnableGraph.fromGraph(FlowGraph.create() { implicit b: FlowGraph.Builder[Unit] =>
import FlowGraph.Implicits._
val merge = b.add(MergePreferred[IncomingConnection](1))
val inA: Source[IncomingConnection, Future[ServerBinding]] = Http().bind(interface = "localhost", port = 8200)
val inB: Source[IncomingConnection, Future[ServerBinding]] = Http().bind(interface = "localhost", port = 8201)
inA ~> merge.preferred
inB ~> merge.in(0)
merge.out ~> Sink.foreach(println)
ClosedShape
}).run()
所以,我有来自A和B的传入连接的来源。
现在我想以某种方式处理它们,产生响应并将响应发送到相应的连接。
也许有更好的方法来归档所有这些东西,但我找不到任何解决此类问题的例子来自其他人的文档或问题。
我想这个问题很常见。
提前感谢您的帮助。
答案 0 :(得分:1)
mvn install
对象用于处理请求和返回响应的方式是使用IncomingConnection
方法。基于documentation和api的示例:
同步功能
handleXXX
然后可以在图表构造中使用此//this processor contains your logic for converting a request into a response
def requestProcessor(httpRequest : HttpRequest) : HttpResponse = ???
val connectionSink = Sink.foreach[IncomingConnection] { conn =>
conn.handleWithSyncHandler(requestProcessor)
}
:
connectionSink
异步功能
同样,如果您的处理器是异步的:
inA ~> merge.preferred
inB ~> merge.in(0)
merge.out ~> connectionSink
<强>流量强>
最后,您还可以使用Flow(我的首选方法):
val asyncReqProcessor(httpRequest : HttpRequest) : Future[HttpResponse] = ???
val connectionSink =
Sink.foreach[IncomingConnection](_ handleWithAsyncHandler asyncProcessor)
关于Flows我最喜欢的一个功能是你可以重复使用它们。在不同的Streams。因此,flowReqProcessor可以是val flowReqProcessor : Flow[HttpRequest, HttpResponse,_] = ???
val connectionSink =
Sink.foreach[IncomingConnection](_ handleWith flowReqProcessor )
而不是val
。