Scala Akka溪流-跳过FlowShape
我有下面的图表 在Scala Akka溪流-跳过FlowShape,scala,akka-stream,Scala,Akka Stream,我有下面的图表 在inflateFlow阶段,我检查数据库中是否已经处理了请求。如果已经有已处理的消息,我想返回MsgSuccess,而不是RequestProcess,但下一个FlowShape不会接受,它需要RequestProcess。是否有一种方法可以从flowflate跳到flowWrap,而无需到处添加或 GraphDSL.create(){隐式生成器:GraphDSL.builder[未使用]=> 导入GraphDSL.Implicits_ val flowInflate=buil
inflateFlow
阶段,我检查数据库中是否已经处理了请求。如果已经有已处理的消息,我想返回MsgSuccess
,而不是RequestProcess
,但下一个FlowShape
不会接受,它需要RequestProcess
。是否有一种方法可以从flowflate
跳到flowWrap
,而无需到处添加或
GraphDSL.create(){隐式生成器:GraphDSL.builder[未使用]=>
导入GraphDSL.Implicits_
val flowInflate=builder.add(wrapFunctionInFlowShape[MsgRequest,RequestProcess](充气流))
val flowProcess=builder.add(wrapFunctionInFlowShape[RequestProcess,SuccessProcess](convertFlow))
val flowWrite=builder.add(wrapFunctionInFlowShape[SuccessProcess,SuccessProcess](writeFlow))
val flowWrap=builder.add(wrapFunctionInFlowShape[SuccessProcess,MsgSuccess](wrapFlow))
flowInflate~>flowProcess~>flowWrite~>flowWrap
FlowShape(flowInflate.in、flowWrap.out)
}
def wrapFunctionInFlowShape[Input,Output](f:Input=>Output):流[Input,Output,NotUsed]={
Flow.from函数{input=>
f(输入)
}
}
//检查缓存
def充气流量(msgRequest:msgRequest):或者[RequestProcess,MsgSuccess]={
val hash:String=hashMethod(msgRequest)
如果(存在数据库(哈希))
右(MsgSuccess(散列))
其他的
左侧(充气(msgRequest))
}
def convertFlow(requestPorocess:RequestPocess):SuccessProcess={}//处理请求}
def writeFlow(successProcess:successProcess):successProcess={}//write to DB}
def wrapFlow(successProcess:successProcess):MsgSuccess={}//包装并返回消息}
您可以在带有分区的流中定义替代路径。在您的情况下,项目中的阶段可能会有所帮助。与标准Akka Streams API中的阶段不同,PartitionWith
允许不同的输出类型:在您的情况下,输出类型是RequestProcess
和MsgSuccess
首先,要使用PartitionWith
,请将以下依赖项添加到build.sbt
:
libraryDependencies += "com.typesafe.akka" %% "akka-stream-contrib" % "0.8"
其次,将inflateFlow
替换为分区:
def split = PartitionWith[MsgRequest, RequestProcess, MsgSuccess] { msgRequest =>
val hash = hashMethod(msgRequest)
if (!existisInDataBase(hash))
Left(inflate(msgRequest))
else
Right(MsgSuccess(hash))
}
然后将该阶段合并到图表中:
val flow = Flow.fromGraph(GraphDSL.create() { implicit builder: GraphDSL.Builder[NotUsed] =>
import GraphDSL.Implicits._
val pw = builder.add(split)
val flowProcess = builder.add(wrapFunctionInFlowShape[RequestProcess, SuccessProcess](convertFlow))
val flowWrite = builder.add(wrapFunctionInFlowShape[SuccessProcess, SuccessProcess](writeFlow))
val flowWrap = builder.add(wrapFunctionInFlowShape[SuccessProcess, MsgSuccess](wrapFlow))
val mrg = builder.add(Merge[MsgSuccess](2))
pw.out0 ~> flowProcess ~> flowWrite ~> flowWrap ~> mrg.in(0)
pw.out1 ~> mrg.in(1)
FlowShape(pw.in, mrg.out)
})
如果在数据库中找不到传入的MsgRequest
,并将其转换为RequestProcess
,则该消息将通过原始流路径。如果传入的MsgRequest
在数据库中,并解析为MsgSuccess
,则它将绕过流中的中间步骤。在这两种情况下,生成的MsgSuccess
消息从两个可选路径合并到一个流出口中