使用akka流向数据库发出Tcp请求

时间:2015-09-16 21:33:41

标签: scala tcp akka akka-stream

我尝试使用akka-streams'向数据库发送查询。 Tcp客户,但我不明白我错过了什么。

所以我有两种类型QueryResponse可以完美转换为来自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]值,我并不完全理解它与值/类型的关系在流程中。

2 个答案:

答案 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()