本文整理汇总了Scala中akka.stream.scaladsl.Merge类的典型用法代码示例。如果您正苦于以下问题:Scala Merge类的具体用法?Scala Merge怎么用?Scala Merge使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了Merge类的7个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Scala代码示例。
示例1: FlowFromGraph
//设置package包名称以及导入依赖的类
package sample.graphDSL
import akka.NotUsed
import akka.actor.ActorSystem
import akka.stream.scaladsl.{Broadcast, Flow, GraphDSL, Merge, Sink, Source}
import akka.stream.{ActorMaterializer, FlowShape, UniformFanInShape, UniformFanOutShape}
object FlowFromGraph {
def main(args: Array[String]): Unit = {
implicit val system = ActorSystem("FlowFromGraph")
implicit val ec = system.dispatcher
implicit val materializer = ActorMaterializer()
val processorFlow1: Flow[Int, Int, NotUsed] = Flow[Int].map(_ * 2)
val processorFlow2: Flow[Int, Int, NotUsed] = Flow[Int].map(_ * 3)
val listOfFlows = List(processorFlow1, processorFlow2)
def compoundFlowFrom[T](indexFlows: Seq[Flow[T, T, NotUsed]]): Flow[T, T, NotUsed] = {
require(indexFlows.nonEmpty, "Cannot create compound flow without any flows to combine")
Flow.fromGraph(GraphDSL.create() { implicit b =>
import akka.stream.scaladsl.GraphDSL.Implicits._
val broadcast: UniformFanOutShape[T, T] = b.add(Broadcast(indexFlows.size))
val merge: UniformFanInShape[T, T] = b.add(Merge(indexFlows.size))
indexFlows.foreach(broadcast ~> _ ~> merge)
FlowShape(broadcast.in, merge.out)
})
}
val compoundFlow = compoundFlowFrom(listOfFlows)
Source(1 to 10)
.via(compoundFlow)
.runWith(Sink.foreach(println(_)))
.onComplete(_ => system.terminate())
}
}
示例2: KinesisSource
//设置package包名称以及导入依赖的类
package akka.stream.alpakka.kinesis.scaladsl
import akka.NotUsed
import akka.stream.alpakka.kinesis.KinesisSourceErrors.NoShardsError
import akka.stream.alpakka.kinesis.{KinesisSourceStage, ShardSettings}
import akka.stream.scaladsl.{Merge, Source}
import com.amazonaws.services.kinesis.AmazonKinesisAsync
import com.amazonaws.services.kinesis.model.Record
object KinesisSource {
def basic(shardSettings: ShardSettings, amazonKinesisAsync: AmazonKinesisAsync): Source[Record, NotUsed] =
Source.fromGraph(new KinesisSourceStage(shardSettings, amazonKinesisAsync))
def basicMerge(shardSettings: List[ShardSettings], amazonKinesisAsync: AmazonKinesisAsync): Source[Record, NotUsed] = {
val create: ShardSettings => Source[Record, NotUsed] = basic(_, amazonKinesisAsync)
shardSettings match {
case Nil => Source.failed(NoShardsError)
case first :: Nil => create(first)
case first :: second :: Nil => Source.combine(create(first), create(second))(Merge(_))
case first :: second :: rest =>
Source.combine(create(first), create(second), rest.map(create(_)): _*)(Merge(_))
}
}
}
示例3: WorkingWithGraphsApplication
//设置package包名称以及导入依赖的类
package com.packt.chapter8
import akka.actor.ActorSystem
import akka.stream._
import akka.stream.scaladsl.{Balance, Broadcast, Flow, GraphDSL, Merge, RunnableGraph, Sink, Source}
import scala.concurrent.duration._
import scala.util.Random
object WorkingWithGraphsApplication extends App {
implicit val actorSystem = ActorSystem("WorkingWithGraphs")
implicit val actorMaterializer = ActorMaterializer()
trait MobileMsg {
def id = Random.nextInt(1000)
def toGenMsg(origin: String) = GenericMsg(id, origin)
}
class AndroidMsg extends MobileMsg
class IosMsg extends MobileMsg
case class GenericMsg(id: Int, origin: String)
val graph = RunnableGraph.fromGraph(GraphDSL.create() { implicit builder =>
import GraphDSL.Implicits._
//Sources
val androidNotification = Source.tick(2 seconds, 500 millis, new AndroidMsg)
val iOSNotification = Source.tick(700 millis, 600 millis, new IosMsg)
//Flow
val groupAndroid = Flow[AndroidMsg].map(_.toGenMsg("ANDROID")).groupedWithin(5, 5 seconds).async
val groupIos = Flow[IosMsg].map(_.toGenMsg("IOS")).groupedWithin(5, 5 seconds).async
def counter = Flow[Seq[GenericMsg]].via(new StatefulCounterFlow())
def mapper = Flow[Seq[GenericMsg]].mapConcat(_.toList)
//Junctions
val aBroadcast = builder.add(Broadcast[Seq[GenericMsg]](2))
val iBroadcast = builder.add(Broadcast[Seq[GenericMsg]](2))
val balancer = builder.add(Balance[Seq[GenericMsg]](2))
val notitificationMerge = builder.add(Merge[Seq[GenericMsg]](2))
val genericNotitificationMerge = builder.add(Merge[GenericMsg](2))
def counterSink(s: String) = Sink.foreach[Int](x => println(s"$s: [$x]"))
//Graph
androidNotification ~> groupAndroid ~> aBroadcast ~> counter ~> counterSink("Android")
aBroadcast ~> notitificationMerge
iBroadcast ~> notitificationMerge
iOSNotification ~> groupIos ~> iBroadcast ~> counter ~> counterSink("Ios")
notitificationMerge ~> balancer ~> mapper.async ~> genericNotitificationMerge
balancer ~> mapper.async ~> genericNotitificationMerge
genericNotitificationMerge ~> Sink.foreach(println)
ClosedShape
})
graph.run()
}
示例4: Wash
//设置package包名称以及导入依赖的类
package com.packt.chapter8
import akka.NotUsed
import akka.actor.ActorSystem
import akka.stream.{ActorMaterializer, FlowShape}
import akka.stream.scaladsl.{Balance, Flow, GraphDSL, Merge, Sink, Source}
import scala.util.Random
trait PipeliningParallelizing extends App {
implicit val actorSystem = ActorSystem("PipeliningParallelizing")
implicit val actorMaterializer = ActorMaterializer()
case class Wash(id: Int)
case class Dry(id: Int)
case class Done(id: Int)
val tasks = (1 to 5).map(Wash)
def washStage = Flow[Wash].map(wash => {
val sleepTime = Random.nextInt(3) * 1000
println(s"Washing ${wash.id}. It will take $sleepTime milliseconds.")
Thread.sleep(sleepTime)
Dry(wash.id)
})
def dryStage = Flow[Dry].map(dry => {
val sleepTime = Random.nextInt(3) * 1000
println(s"Drying ${dry.id}. It will take $sleepTime milliseconds.")
Thread.sleep(sleepTime)
Done(dry.id)
})
val parallelStage = Flow.fromGraph(GraphDSL.create() { implicit builder =>
import GraphDSL.Implicits._
val dispatchLaundry = builder.add(Balance[Wash](3))
val mergeLaundry = builder.add(Merge[Done](3))
dispatchLaundry.out(0) ~> washStage.async ~> dryStage.async ~> mergeLaundry.in(0)
dispatchLaundry.out(1) ~> washStage.async ~> dryStage.async ~> mergeLaundry.in(1)
dispatchLaundry.out(2) ~> washStage.async ~> dryStage.async ~> mergeLaundry.in(2)
FlowShape(dispatchLaundry.in, mergeLaundry.out)
})
def runGraph(testingFlow: Flow[Wash, Done, NotUsed]) = Source(tasks).via(testingFlow).to(Sink.foreach(println)).run()
}
示例5: Demo3
//设置package包名称以及导入依赖的类
package lew.bing.akka.stream
import akka.NotUsed
import akka.actor.ActorSystem
import akka.stream.scaladsl.{Broadcast, Flow, GraphDSL, Merge, RunnableGraph, Sink, Source}
import akka.stream.{ActorMaterializer, ClosedShape}
object Demo3 {
def main(args: Array[String]): Unit = {
implicit val system = ActorSystem("QuickStart")
implicit val materializer = ActorMaterializer()
val g = RunnableGraph.fromGraph(GraphDSL.create(){implicit builder:GraphDSL.Builder[NotUsed] =>
import GraphDSL.Implicits._
val in = Source(1 to 10)
val out = Sink.foreach(println)
val bcast = builder.add(Broadcast[Int](2))
val merge = builder.add(Merge[Int](2))
val f1, f2, f3, f4 = (k:Int) => Flow[Int].map(i => {
println(s"??$k : $i")
i + 10
})
in ~> f1(1) ~> bcast ~> f2(2) ~> merge ~> f3(3) ~> out
bcast ~> f4(4) ~> merge
ClosedShape
})
g.run()
Thread.sleep(3000)
System.exit(0)
}
}
示例6: ChatStreamHandler
//设置package包名称以及导入依赖的类
package com.example.routes
import akka.http.scaladsl.model.ws.{Message, TextMessage}
import akka.stream.{FlowShape, Materializer, OverflowStrategy}
import akka.stream.scaladsl.{Broadcast, Flow, GraphDSL, Merge, Sink, Source}
import com.example.chat.{ChatSystemMessages, ChatSystemService}
import com.example.chat.ChatSystemMessages._
case class ChatStreamHandler()(implicit chatSystemService: ChatSystemService, materializer: Materializer) {
def handler(userId: String): Flow[Message, Message, _] =
Flow.fromGraph(GraphDSL.create(Source.actorRef[SystemMessage](5, OverflowStrategy.fail)) {
implicit builder =>
participantSource =>
import GraphDSL.Implicits._
val fromClientFlow = builder.add(Flow[Message].collect {
case TextMessage.Strict(txt) => NewMessage(userId, MessageBody(txt))
})
val merge = builder.add(Merge[ChatSystemMessage](3))
val broadcast = builder.add(Broadcast[ChatSystemMessage](2))
val toClientFlow = builder.add(Flow[SystemMessage].map[Message] {
case SystemMessage(body) => TextMessage.Strict(body)
})
val actorMaterializedSource = builder.materializedValue.map {
actor => chatSystemService.findUser(userId) match {
case Some(_) => JoinedMessage(userId, actor)
case None => RejectMessage(userId, actor)
}
}
val reportLastMessageFlow = builder.add(Flow[ChatSystemMessage].map {
case JoinedMessage(_, userActor) => ReportMessage(chatSystemService.findMessages(20), userActor)
case [email protected]_ => m
})
val registerMessageFlow = builder.add(Flow[ChatSystemMessage].map {
case [email protected](_userId, body) =>
chatSystemService.addMessage(_userId, body.value)
msg
case [email protected]_ => msg
})
def toChatGroupActorSink(userId: String) =
Sink.actorRef[ChatSystemMessages.ChatSystemMessage](chatSystemService.chatGroupActor, LeftMessage(userId))
actorMaterializedSource ~> broadcast
broadcast ~> reportLastMessageFlow ~> merge
broadcast ~> merge
fromClientFlow ~> registerMessageFlow ~> merge ~> toChatGroupActorSink(userId)
participantSource ~> toClientFlow
FlowShape(fromClientFlow.in, toClientFlow.out)
})
}
示例7: SessionStream
//设置package包名称以及导入依赖的类
package com.auginte.eventsourced
import akka.actor.ActorRef
import akka.stream.SourceShape
import akka.stream.scaladsl.{GraphDSL, Merge, Source}
case class SessionStream(storage: Storage, project: Project, realTimeMessages: ActorRef, uuid: UUID = SessionStream.newUuid) {
lazy val stream = GraphDSL.create() { implicit b =>
import GraphDSL.Implicits._
val merge = b.add(Merge[String](2)) // Blocking operation
storage.readAll(project) ~> merge
RealTimeMessages.source(realTimeMessages) ~> merge
SourceShape(merge.out)
}
}
object SessionStream {
def newUuid: UUID = java.util.UUID.randomUUID.toString
}