我尝试使用akka-streams'向数据库发送查询。 Tcp
客户,但我不明白我错过了什么。
所以我有两种类型Query
和Response
可以完美转换为来自akka' ByteString
。所以我创建了一个与val conn = Tcp().outgoingConnection("localhost", 28015)
的客户端连接,这给了我一个Flow[ByteString, ByteString, Future[OutgoingConnection]]
,到目前为止一直很好。所以我假设源代码是我对查询的请求,我无法找到使用查询源提供此流的最佳方法,而是将其构建为Source(Future.successful(query))
,并将其连接到流{{} 1}},它给了我另一个source.via(flow)
。在这里我无法理解如何获得Source[Response, Unit]
,尝试了几个组合器,但它给了我Future[Response]
值,我并不完全理解它与值/类型的关系在流程中。
答案 0 :(得分:1)
首先:它是什么类型的数据库,为什么要直接通过TCP接收它?你确定这会使你如何缩进它吗?您是否能够处理传入响应的框架?
关于从Future[Response]
获取Source[Response, Unit]
的问题,就像使用Sink.head
运行来源一样简单,例如:val res: Future[Result] = source.runWith(Sink.head)
(您需要)当然是implicit val mat = ActorMaterializer()
。
我强烈建议您在深入使用Streams之前花些时间在Akka Streams documentation上。
答案 1 :(得分:0)
您可以在Flow上使用join
方法。来自文档:
通过交叉连接输入和连接此流程到另一个流程 输出,创建一个RunnableGraph。
+------+ +-------+
| | ~Out~> | |
| this | | other |
| | <~In~ | |
+------+ +-------+
这允许您将连接的输出连接到Flow的输入,并将Flow的输出连接到连接输入。
具体来说,您可以从outgoingConnection生成Flow
并将其与您创建的Flow一起加入以响应查询:
def queryDB(query : ByteString) : Future[ByteString] = ???
val concurrentQueries = 10
val queryResponder =
Flow[ByteString].mapAsync(concurrentQueries)(queryDB)
val server : String = ???
val port : Int = ???
//from the diagram above:
//this = connection
//other = queryResponder
Tcp().outgoingConnection(server, port).join(queryResponder).run()