私はアクカストリームを使ってスロットルを実装していて、ほとんど動作しています。メッセージのリストを毎回1つずつ送信したいので、ほとんど効果があります。 AkkaのActorsがコール・アクターの前にメサージを蓄積できるかどうかはわかりません。コールの前にメッセージを蓄積するアクタのアクタ
私は、以下の例はシンプルですが実際のシナリオでは、RabbitMQから数多くのメッセージを受け取り、あまりにも高いレートを避けるために数秒後に俳優に電話したいと思っています。 Webサービスを呼び出します。ここで
は私がやったことです:私の例で
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
が二度呼ばれることreceive
機能に最大2つのオブジェクトのコレクションを受け取りたいです。
2つのメッセージ(例:CoolThing("message 1")
とCoolThing("message 2")
)を送信した場合、俳優にはList(CoolThing("message 1"), CoolThing("message 2")
を受け取ることができますか?