Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala Akka溪流-跳过FlowShape_Scala_Akka Stream - Fatal编程技术网

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
消息从两个可选路径合并到一个流出口中