Scala Akka流中的串联流

Scala Akka流中的串联流,scala,akka,akka-stream,apache-kafka-streams,akka-http,Scala,Akka,Akka Stream,Apache Kafka Streams,Akka Http,我们正在使用卡夫卡,并希望使用卡夫卡访问州存储中的数据。我们有一个现有的服务,它使用akkahttp提供restapi,我们希望将交互式查询集成到流中 这似乎是一个完美的适合这个。但是,它通过公开使用低级API的route属性集成到Akka HTTP中,该属性映射到流[HttpRequest,HttpResponse,Any]。我们之前的所有代码都使用Akka HTTP的路由DSL连接代码 我希望下面这样的代码能够正常工作,但实际情况并非如此: 隐式val系统:ActorSystem=Actor

我们正在使用卡夫卡,并希望使用卡夫卡访问州存储中的数据。我们有一个现有的服务,它使用akkahttp提供restapi,我们希望将交互式查询集成到流中

这似乎是一个完美的适合这个。但是,它通过公开使用低级API的
route
属性集成到Akka HTTP中,该属性映射到
流[HttpRequest,HttpResponse,Any]
。我们之前的所有代码都使用Akka HTTP的路由DSL连接代码

我希望下面这样的代码能够正常工作,但实际情况并非如此:

隐式val系统:ActorSystem=ActorSystem(“web”)
隐式val物化器:ActorMaterializer=ActorMaterializer()
隐式val ec=system.dispatcher
val firstRoutes:路由=//已填充的路由对象
val lastRoutes:路由=//其他路由对象已填充
val iqServiceFlow:Flow[HttpRequest,HttpResponse,Any]=…//返回交互式查询服务的代码
val firstFlow=Route.handlerFlow(firstRoutes)
val lastFlow=路由。句柄流(lastRoutes)
//下面的代码不起作用,尽管我在网上看到的一切都表明它应该起作用
val handler=firstFlow通过iqServiceFlow通过lastFlow
Http().bindAndHandle(处理程序,“0.0.0.0”,8000)
我如何组合Akka溪流中的流量

编辑
更正了处理程序分配语句。

为了清晰起见,让我们先明确所有返回类型:

val iqServiceFlow:Flow[HttpRequest,HttpResponse,Any]=。。。
val firstFlow:Flow[HttpRequest,HttpResponse,NotUsed]=路由。handlerFlow(firstRoutes)
val lastFlow:Flow[HttpRequest,HttpResponse,NotUsed]=Route.handlerFlow(lastproutes)
而且,不是

val handler=firstRoutes via iqServiceFlow via lastFlow
…你可能是说:

val handler=firstFlow via iqServiceFlow via lastFlow
为了通过将流与
链接在一起,输入和输出类型必须匹配:即,第一个流的输出类型必须与第二个流的输入类型相同,依此类推。您试图对处理程序执行以下操作:

[HttpRequest,HttpResponse]//firstFlow
|
v
[HttpRequest,HttpResponse]//iqServiceFlow
|
v
[HttpRequest,HttpResponse]//lastFlow
所有流的输出类型都是
HttpResponse
,但它们各自的输入类型都是
HttpRequest
,因此不能通过
将它们链接在一起

要链接流,您需要一个函数,该函数以某种方式将
HttpResponse
转换为
HttpRequest

val respToReq:HttpResponse=>HttpRequest=。。。
您可以通过上述函数创建流:

val convertingFlow:Flow[HttpResponse,HttpRequest]=Flow.fromFunction(respToReq)
现在,您可以链接您的流:

val handler=firstFlow via convertingFlow via iqServiceFlow via convertingFlow via lastFlow
这些类型排列如下:

[HttpRequest,HttpResponse]//firstFlow
|
v
[HttpResponse,HttpRequest]//转换流
|
v
[HttpRequest,HttpResponse]//iqServiceFlow
|
v
[HttpResponse,HttpRequest]//转换流
|
v
[HttpRequest,HttpResponse]//lastFlow

以上假设您可以重用相同的转换函数/流。如果这个假设不成立,您显然可以创建不同的转换函数/流。

为了清楚起见,让我们先明确所有返回类型:

val iqServiceFlow:Flow[HttpRequest,HttpResponse,Any]=。。。
val firstFlow:Flow[HttpRequest,HttpResponse,NotUsed]=路由。handlerFlow(firstRoutes)
val lastFlow:Flow[HttpRequest,HttpResponse,NotUsed]=Route.handlerFlow(lastproutes)
而且,不是

val handler=firstRoutes via iqServiceFlow via lastFlow
…你可能是说:

val handler=firstFlow via iqServiceFlow via lastFlow
为了通过
将流与
链接在一起,输入和输出类型必须匹配:即,第一个流的输出类型必须与第二个流的输入类型相同,依此类推。您试图对处理程序执行以下操作:

[HttpRequest,HttpResponse]//firstFlow
|
v
[HttpRequest,HttpResponse]//iqServiceFlow
|
v
[HttpRequest,HttpResponse]//lastFlow
所有流的输出类型都是
HttpResponse
,但它们各自的输入类型都是
HttpRequest
,因此不能通过
将它们链接在一起

要链接流,您需要一个函数,该函数以某种方式将
HttpResponse
转换为
HttpRequest

val respToReq:HttpResponse=>HttpRequest=。。。
您可以通过上述函数创建流:

val convertingFlow:Flow[HttpResponse,HttpRequest]=Flow.fromFunction(respToReq)
现在,您可以链接您的流:

val handler=firstFlow via convertingFlow via iqServiceFlow via convertingFlow via lastFlow
这些类型排列如下:

[HttpRequest,HttpResponse]//firstFlow