在调用Akka上的Actor之前累积消息

在调用Akka上的Actor之前累积消息,akka,akka-stream,Akka,Akka Stream,我用Akka Stream实现了一个节流阀,它几乎可以工作了。它几乎可以工作,因为我想发送一个邮件列表,而不是每次发送一条。我不确定Akka的演员是否允许在给演员打电话之前积累台币 我知道下面的示例很简单,但在实际场景中,我将从RabbitMQ接收大量消息,我希望在几秒钟后调用actor以避免过高的速率—在收到消息后,我将调用webservice 以下是我所做的: import akka.NotUsed import akka.actor.{Actor, ActorRef, ActorSyste

我用Akka Stream实现了一个节流阀,它几乎可以工作了。它几乎可以工作,因为我想发送一个邮件列表,而不是每次发送一条。我不确定Akka的演员是否允许在给演员打电话之前积累台币

我知道下面的示例很简单,但在实际场景中,我将从RabbitMQ接收大量消息,我希望在几秒钟后调用actor以避免过高的速率—在收到消息后,我将调用webservice

以下是我所做的:

import akka.NotUsed
import akka.actor.{Actor, ActorRef, ActorSystem, Props}
import akka.stream.{ActorMaterializer, OverflowStrategy, ThrottleMode}
import akka.stream.scaladsl.{Sink, Source}

import scala.concurrent.duration._

object AkkaStream {
  def main(args:Array[String]): Unit = {
    val system = ActorSystem("HelloSystem")
    val actor = system.actorOf(Props[ToughActor])
    implicit val materializer = ActorMaterializer.create(system)
    val throttler: ActorRef =
      Source.actorRef(bufferSize = 1000, OverflowStrategy.dropNew)
        .throttle(2, 5.second, 2, ThrottleMode.Shaping)
        .to(Sink.actorRef(actor, NotUsed))
        .run()

    throttler ! CoolThing("message 1")
    throttler ! CoolThing("message 2")
    throttler ! CoolThing("message 3")
    throttler ! CoolThing("message 4")
    throttler ! CoolThing("message 5")
  }
}

class ToughActor extends Actor {
  def receive = {
    case x => println(x.getClass)
  }
}

case class CoolThing(name: String)
在我的示例中,我希望在
receive
函数上接收最多2个对象的集合,而不是调用两次
receive


如果我发送了两条消息(例如:
CoolThing(“消息1”)
CoolThing(“消息2”)
),则可以在Actor上接收到一个
列表(CoolThing(“消息1”),

我认为您想要的是分组功能,而不是节流阀。或者一个接一个

例如


更多信息,我想您需要的是分组功能,而不是节流阀。或者一个接一个

例如

更多

 Source.actorRef(bufferSize = 1000, OverflowStrategy.dropNew)
    .groupedWithin(2, 2.seconds)
    .to(Sink.actorRef(actor, NotUsed))
    .run()