さまざまなタイプのメッセージをイベントストリームに公開する必要があります。たとえば、タイプAのメッセージが10個投稿され、タイプBのメッセージが1つ投稿され、Bの優先度がより高い場合、それらのメッセージの優先度は異なる必要があります。 Aの優先度-タイプAのメッセージがキューに10個ある場合でも、メッセージBは次のアクターによって取得される必要があります。
ここで優先メッセージについて読み、そのメールボックスの簡単な実装を作成しました。
class PrioritizedMailbox(settings: Settings, cfg: Config) extends UnboundedPriorityMailbox(
PriorityGenerator {
case ServerPermanentlyDead => println("Priority:0"); 0
case ServerDead => println("Priority:1"); 1
case _ => println("Default priority"); 10
}
)
次に、application.confで構成しました
akka {
actor {
prio-dispatcher {
type = "Dispatcher"
mailbox-type = "mailbox.PrioritizedMailbox"
}
}
}
そして私の俳優に配線されました:
private val myActor = actors.actorOf(
Props[MyEventHandler[T]].
withRouter(RoundRobinRouter(HIVE)).
withDispatcher("akka.actor.prio-dispatcher").
withCreator(
new Creator[Actor] {
def create() = new MyEventHandler(storage)
}), name = "eventHandler")
メッセージを送信するためにActorSystem.eventStream.publishを使用しており、アクターはそれにサブスクライブされています(メッセージが処理されていることをログで確認できますが、FIFO順になっています)。
ただし、ログ/コンソールで「デフォルトの優先度」のようなメッセージを見たことがないため、十分ではないようです。ここで何かが足りませんか?説明されているアプローチは、イベントストリームで機能しますか、それともアクターにメッセージを送信する直接呼び出しで機能しますか?また、eventStreamを使用して優先メッセージを取得するにはどうすればよいですか?